在OSX中重新映射密钥的正确API是什么?

时间:2017-02-08 05:03:06

标签: macos nstouchbar

我正在寻找Karabiner,这是Parallels开发的OSX键盘重映射器。根据{{​​3}},最好通过向Apple提交一个错误来解决这个问题。

创建此类功能的替代方法(如果有)支持哪些API?

2 个答案:

答案 0 :(得分:1)

notedpkamb在OP链接到的github问题上(自他发表以来添加),Apple technote TN2450记录了正确的API:

IOKit HID API可用于密钥重新映射。用户将 提供HID事件系统将重映射的字典 应用于键盘。
清单3:使用IOKit HID进行键重映射 蜜蜂。 //使用Xcode 8.2.1编译

single.row = TRUE

示例:
如果您试图在外部USB键盘上重新映射命令/选项/控制键,请查看#import <Foundation/Foundation.h> #import <IOKit/hidsystem/IOHIDEventSystemClient.h> #import <IOKit/hidsystem/IOHIDServiceClient.h> #import <IOKit/hid/IOHIDUsageTables.h> int main(int argc, char *argv[]) { IOHIDEventSystemClientRef system; CFArrayRef services; uint64_t aKey = 0x700000004; uint64_t bKey = 0x700000005; NSArray *map = @[ @{@kIOHIDKeyboardModifierMappingSrcKey:@(aKey), @kIOHIDKeyboardModifierMappingDstKey:@(bKey)}, @{@kIOHIDKeyboardModifierMappingSrcKey:@(bKey), @kIOHIDKeyboardModifierMappingDstKey:@(aKey)}, ]; system = IOHIDEventSystemClientCreateSimpleClient(kCFAllocatorDefault); services = IOHIDEventSystemClientCopyServices(system); for(CFIndex i = 0; i < CFArrayGetCount(services); i++) { IOHIDServiceClientRef service = (IOHIDServiceClientRef)CFArrayGetValueAtIndex(services, i); if(IOHIDServiceClientConformsTo(service, kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard)) { IOHIDServiceClientSetProperty(service, CFSTR(kIOHIDUserKeyUsageMapKey), (CFArrayRef)map); } } CFRelease(services); CFRelease(system); return 0; } 中定义的enum。例如,可以使用以下映射重新映射Z-88键盘以匹配MacBookPro上的键布局:

IOHIDUsageTables.h
  • LeftGUI(E3)→LeftAlt(E2)
  • LeftAlt(E2)→LeftGUI(E3)
  • RightAlt(E6)→RightGUI(E7)
  • 应用程序(65)→RightAlt(E6)

要撤消映射,请将相同的键映射回其原始值。使用上面的示例:

NSArray *remap = @[
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E3),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E2)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E2),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E3)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E6),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E7)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x700000065),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E6)}
];

答案 1 :(得分:-1)

Karabiner-Elements尽管具有粗略的文档和用户界面,但功能强大且用途广泛,可用于进行中的工作。有许多有用的示例,例如this one,这些示例需要专用工具和Karabiner错误日志来生成棘手的JSON规则。任何键都可以同时是修饰键和常规键,运行程序等。 GitHub上的公共领域。