【发布时间】:2021-12-26 23:56:39
【问题描述】:
在 macOS 中,IOKitHID API 可用于密钥重新映射。在下面的示例中,A 键被重新映射到 B 键,反之亦然,使用 Objective-C。
是否可以使用最新的 Swift 5.5 以编程方式进行相同的重新映射?如果可以,下面的例子看起来如何用 Swift 重写?
或者是否有一种新的、更现代的 API 可以与 Swift 一起使用来完成相同的任务?
#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;
}
【问题讨论】:
标签: swift objective-c macos hid iokit