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

Macos 在OSX中重新映射密钥的正确API是什么?,macos,nstouchbar,Macos,Nstouchbar,我在看Karabiner,一款用于Parallels开发的OSX键盘改版。根据这一点,最好通过向苹果提交一个bug来修复 创建此类功能的替代(如果有)受支持的API是什么 尽管文档和用户界面很粗略,但它还是可靠且通用的,可以原谅正在进行的工作。有许多有用的例子,例如,需要专用工具和Karabiner错误日志来生成复杂的JSON规则。任何键都可以同时是修改器和常规键、运行程序等。GitHub上的公共域。正如OP链接到的GitHub问题(自他发布后添加)所述,记录了正确的API: IOKit HID

我在看Karabiner,一款用于Parallels开发的OSX键盘改版。根据这一点,最好通过向苹果提交一个bug来修复

创建此类功能的替代(如果有)受支持的API是什么

尽管文档和用户界面很粗略,但它还是可靠且通用的,可以原谅正在进行的工作。有许多有用的例子,例如,需要专用工具和Karabiner错误日志来生成复杂的JSON规则。任何键都可以同时是修改器和常规键、运行程序等。GitHub上的公共域。

正如OP链接到的GitHub问题(自他发布后添加)所述,记录了正确的API:

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

#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;
}
  • LeftGUI(E3)→ LeftAlt(E2)
  • LeftAlt(E2)→ LeftGUI(E3)
  • 右Alt(E6)→ RightGUI(E7)
  • 申请书(65)→ 右Alt(E6)
要撤消映射,请将相同的键映射回其原始值。使用上述示例:

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

这似乎并不能回答在macOS上应该使用什么API进行密钥重新映射的问题。也许最好的答案是不要重新发明Karabiner,因为Karabiner元素解决了导致该问题的问题。OP特别要求使用Karabiner的替代品。诚然,在中断3年后,开发可能会再次进行,因此有必要重新评估Karabiner作为一种选择,但这仍然不能回答问题。Karabiner-Elements是Karabiner的替代品。
NSArray *unmap = @[
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E3),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E3)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E2),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E2)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x7000000E6),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x7000000E6)},
  @{@kIOHIDKeyboardModifierMappingSrcKey:@(0x700000065),
    @kIOHIDKeyboardModifierMappingDstKey:@(0x700000065)}
];