应用程序随机停止接收按键(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)的主要内容,如果未能解决你的问题,请参考以下文章