无法使用事件点击模拟某些应用程序上的退格按钮

时间:2012-05-24 17:02:11

标签: objective-c macos cocoa cgeventtap

我正在尝试模拟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;
}

1 个答案:

答案 0 :(得分:2)

某些应用程序会根据事件的关键代码(CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode))找到正在键入的内容,而不是事件的UnicodeString

也就是说,您需要将事件的kCGKeyboardEventKeycode值从“h”提供的 4 更新为 51 或( 0x33 < / strong>)退格。