objective-c - 无法通过事件点击在某些应用程序上模拟退格按钮

标签 objective-c macos cocoa cgeventtap

我正在尝试模拟 Mac 操作系统上的一些按键。如果按下“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;
}

最佳答案

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

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

关于objective-c - 无法通过事件点击在某些应用程序上模拟退格按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742086/

相关文章:

ios - 在 xib 中设置用于单击和双击的 UIGestureRecognizers

iPhone Objective-C 获取股票报价的最简单方法

json - 从 OSX 上的媒体文件元数据解析 JSON 值

cocoa - 使用 NSString 中断 NSString,获取用于中断/分隔的字符串之后的所有内容

objective-c - 制作不受管理的 NSManagedObject 的副本

ios - 核心蓝牙 - 在后台执行长期操作

ios - 为什么 TwitterKit didEncounterError (withMessage Invalid parameter not satisfying- error)

objective-c - NSWindowDelegate : windowDidBecomeKey vs windowDidBecomeMain

macos - 如何在同一个 Mac 窗口中显示一个新的 View Controller ?

objective-c - 我的 NSView 子类不会刷新/重绘,但会调用 -drawRect