You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在macOS上检测键盘是否带有Globe键?

检测Mac键盘是否带有Globe(🌐)键并适配快捷键显示

在AppKit中,Globe键和普通fn键都会被识别为NSEvent.ModifierFlags.function,但系统菜单能根据键盘硬件类型自动切换显示🌐或“fn”标识。要在自定义视图/菜单中实现相同逻辑,需要通过查询HID设备属性来判断当前键盘是否带有Globe键。

核心实现思路

系统通过检查键盘HID设备是否包含kHIDKeyboardModifierGlobe元素来判断是否存在Globe键。我们可以借助IOKit的HID框架来实现这一检测。

代码实现(AppKit/Swift)

首先需要导入IOKit.hid框架:

import IOKit.hid

实现检测函数:

func hasGlobeKey() -> Bool {
    let manager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDManagerOptionNone))
    guard manager != nil else { return false }
    
    // 设置匹配规则:筛选键盘设备
    let matchingDict = [
        kIOHIDDeviceUsagePageKey: kHIDPage_GenericDesktop,
        kIOHIDDeviceUsageKey: kHIDUsage_GD_Keyboard
    ] as CFDictionary
    IOHIDManagerSetDeviceMatching(manager, matchingDict)
    
    // 获取所有匹配的键盘设备
    guard let devices = IOHIDManagerCopyDevices(manager) as? [IOHIDDevice] else {
        IOHIDManagerClose(manager, IOOptionBits(kIOHIDManagerOptionNone))
        return false
    }
    
    defer {
        IOHIDManagerClose(manager, IOOptionBits(kIOHIDManagerOptionNone))
    }
    
    // 遍历设备,检查是否包含Globe键元素
    for device in devices {
        guard let elements = IOHIDDeviceCopyMatchingElements(device, nil, IOOptionBits(kIOHIDOptionsTypeNone)) as? [IOHIDElement] else {
            continue
        }
        for element in elements {
            let usagePage = IOHIDElementGetUsagePage(element)
            let usage = IOHIDElementGetUsage(element)
            if usagePage == kHIDPage_KeyboardOrKeypad && usage == kHIDKeyboardModifierGlobe {
                return true
            }
        }
    }
    
    return false
}

在自定义视图中使用

在需要显示快捷键标识的地方,调用上述函数判断:

// AppKit菜单按钮示例
let shortcutLabel = hasGlobeKey() ? "🌐" : "fn"
let menuItem = NSMenuItem(title: "自定义命令", action: #selector(handleCommand), keyEquivalent: "")
menuItem.keyEquivalentModifierMask = .function
// 可通过富文本设置快捷键标识
let attributedTitle = NSMutableAttributedString(string: "自定义命令  \(shortcutLabel)+X")
menuItem.attributedTitle = attributedTitle

// SwiftUI视图示例
struct ShortcutView: View {
    private let hasGlobe = hasGlobeKey()
    
    var body: some View {
        Text("自定义命令  \(hasGlobe ? "🌐" : "fn")+X")
            .font(.system(size: 13))
    }
}

注意事项

  • 该检测会遍历当前连接的所有键盘设备,只要有一个设备带有Globe键就会返回true,和系统菜单的逻辑一致。
  • 无需额外权限,IOKit的HID设备查询属于系统常规API调用。

内容的提问来源于stack exchange,提问作者1024jp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:02:42