应用程序随机停止接收按键(CGEventTaps)

Posted

技术标签:

【中文标题】应用程序随机停止接收按键(CGEventTaps)【英文标题】:Application randomly stops receiving key presses (CGEventTaps) 【发布时间】:2011-01-18 17:35:45 【问题描述】:

所以,我浪费了很多时间来创建这个非常酷的键盘宏应用程序。它工作得很好,唯一的问题是几分钟后,它就停止工作了。当我按下一个键时,它不再被调用。

我无法锁定它,但它总是需要至少 30 秒才能发生。通常它不会发生几分钟。到那时我会截获并发出许多事件。当它发生时,应用程序仍在运行。

这是我正在做的一个例子来倾听

 -(void)listen 

      CFMachPortRef downEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionDefault,CGEventMaskBit(kCGEventKeyDown),&onKeyDown,self);  
      downSourceRef = CFMachPortCreateRunLoopSource(NULL, downEventTap, 0);
      CFRelease(downEventTap);
      CFRunLoopAddSource(CFRunLoopGetCurrent(), downSourceRef, kCFRunLoopDefaultMode);
      CFRelease(downSourceRef)

还有处理程序 -

CGEventRef onKeyDown(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) 
    NSLog(@"DOWN (%i)", CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)); 
    // When it matches, I return CGEventCreate(NULL) to stop the event
    return event;

另外请注意,当我拦截一个事件(并返回 CGEventCreate(NULL))时,我通常会使用以下代码自己发出一个或多个按键。请注意,KeyCmd 等只是普通常量的快捷方式。

 - (void)sendKey:(KeyCode)code cmd:(BOOL)cmd alt:(BOOL)alt ctl:(BOOL)ctl shift:(BOOL)shift 

    CGEventFlags flags = 0;

    if (cmd) flags = flags | KeyCmd;
    if (alt) flags = flags | KeyAlt;
    if (ctl) flags = flags | KeyCtl;
    if (shift) flags = flags | KeyShift;    

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef keyDownPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)code, YES);

    CGEventSetFlags(keyDownPress, flags);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDownPress);

    CFRelease(keyDownPress);
    CFRelease(source);

谢谢!

【问题讨论】:

【参考方案1】:

我认为 Snow Leopard 中存在一个错误,如果出现超时,它会阻止你的听众。

在您的 keyDown 处理程序中,检查以下类型,然后重新启用侦听器。

if (type == kCGEventTapDisabledByTimeout) 
    NSLog(@"Event Taps Disabled! Re-enabling");
            CGEventTapEnable(eventTap, true);
    return event;

【讨论】:

以上是关于应用程序随机停止接收按键(CGEventTaps)的主要内容,如果未能解决你的问题,请参考以下文章

在C#应用程序中接收操作系统级别的按键事件

FCM android客户端随机停止接收数据消息

Android Widget 随机停止工作

在 Linux 终端应用程序中接收按键和按键释放事件?

修改后的 USB 键盘驱动程序不接收按键 (Linux)

按键精灵怎么随机生成1到12数字并且不重复