我正在尝试模拟Mac OS上的一些按键操作。如果按下'h'键,该代码应该删除一个前一个字符(例如,如果用户通过修改键盘事件键入'tigh'它将变为'ti')。但它只适用于某些应用程序;其他人完全拒绝我的活动。这段代码有问题吗?
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
CFMachPortRef eventTap;
CGEventMask eventMask;
CFRunLoopSourceRef runLoopSource;
eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp));
eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0,
eventMask, KeyHandler, NULL);
if (!eventTap) {
fprintf(stderr, "failed to create event tap\n");
exit(1);
}
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
}
CGEventRef KeyHandler(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
UniCharCount actualStringLength;
UniCharCount maxStringLength = 1;
UniChar chars[3];
CGEventKeyboardGetUnicodeString(event, maxStringLength, &actualStringLength, chars);
if (chars[0] == 'h') {
chars[0] = '\b';
CGEventKeyboardSetUnicodeString(event, 1, chars);
return event;
}
return event;
}
答案 0 :(得分:2)
某些应用程序会根据事件的关键代码(CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)
)找到正在键入的内容,而不是事件的UnicodeString
。
也就是说,您需要将事件的kCGKeyboardEventKeycode
值从“h”提供的 4 更新为 51 或( 0x33 < / strong>)退格。