在 macOS 中,IOKit HIDAPI 可用于鍵重映射。在下面的示例中,使用 Objective-CA將Bkey重新映射到key,反之亦然。
是否可以使用最新的 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;
}
uj5u.com熱心網友回復:
你可以像這樣在 Swift 5.5 中重寫你被詛咒的代碼:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
remapKeys()
}
func remapKeys() {
let aKey: UInt64 = 0x700000004
let bKey: UInt64 = 0x700000005
let map: [[String: UInt64]] = [
[kIOHIDKeyboardModifierMappingSrcKey:aKey,
kIOHIDKeyboardModifierMappingDstKey:bKey],
[kIOHIDKeyboardModifierMappingSrcKey:bKey,
kIOHIDKeyboardModifierMappingDstKey:aKey],
]
let system = IOHIDEventSystemClientCreateSimpleClient(kCFAllocatorDefault)
let services = IOHIDEventSystemClientCopyServices(system)
for service in services as! [IOHIDServiceClient] {
if((IOHIDServiceClientConformsTo(service, UInt32((kHIDPage_GenericDesktop)), UInt32(kHIDUsage_GD_Keyboard))) != 0) {
IOHIDServiceClientSetProperty(service, kIOHIDUserKeyUsageMapKey as CFString, map as CFArray)
}
}
}
}
如果您創建一個包含這些匯入的橋接頭:
#import <IOKit/hidsystem/IOHIDEventSystemClient.h>
#import <IOKit/hidsystem/IOHIDServiceClient.h>
#import <IOKit/hid/IOHIDUsageTables.h>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/365198.html
上一篇:使用http協議時的通用鏈接問題
