如何在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
相关产品推荐
相关产品推荐

