如何用Swift 5.5基于IOKit实现按键重映射及相关API问询
问题解答
可行性说明
Swift 5.5及以上版本完全可以实现相同的A、B按键互换的重映射效果,Swift对IOKit的C语言API桥接支持完善,无需额外依赖第三方组件。
改写后的Swift版本代码
首先需要在Xcode项目中创建Objective-C桥接头文件(.h)并导入依赖的头文件,内容如下:
#import <IOKit/hidsystem/IOHIDEventSystemClient.h> #import <IOKit/hidsystem/IOHIDServiceClient.h> #import <IOKit/hid/IOHIDUsageTables.h>
Swift实现代码:
import Foundation func swapABKeyRemap() { let aKey: UInt64 = 0x700000004 let bKey: UInt64 = 0x700000005 // 构建按键映射规则 let keyMap = [ [kIOHIDKeyboardModifierMappingSrcKey as String: aKey, kIOHIDKeyboardModifierMappingDstKey as String: bKey], [kIOHIDKeyboardModifierMappingSrcKey as String: bKey, kIOHIDKeyboardModifierMappingDstKey as String: aKey] ] as [[String: UInt64]] // 创建HID事件系统客户端 guard let systemClient = IOHIDEventSystemClientCreateSimpleClient(kCFAllocatorDefault) else { return } guard let serviceList = IOHIDEventSystemClientCopyServices(systemClient) as? [IOHIDServiceClient] else { CFRelease(systemClient) return } // 匹配所有键盘设备应用映射规则 for service in serviceList { if IOHIDServiceClientConformsTo(service, kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard) { IOHIDServiceClientSetProperty(service, kIOHIDUserKeyUsageMapKey as CFString, keyMap as CFArray) } } CFRelease(serviceList) CFRelease(systemClient) } // 执行映射 swapABKeyRemap()
*注意:运行该代码的应用需要提前在「系统设置>隐私与安全性>辅助功能」中开启辅助功能权限,否则映射规则不会生效。
适配Swift的现代API说明
目前苹果官方没有推出比IOKit HID更现代的原生Swift API,按键重映射这类底层硬件交互逻辑仍然依赖IOKit框架实现。如果需要更符合Swift语法习惯的调用方式,可以使用第三方开源的IOKit Swift封装库,无需手动处理C API桥接,类型安全性更高。
内容的提问来源于stack exchange,提问作者Tzar
相关产品推荐
相关产品推荐

