应用程序随机停止接收钥匙按压(CGEVENTTAPS)
-
12-10-2019 - |
题
因此,我浪费了很多时间,创建了这个非常酷的键盘宏观应用程序。它效果很好,唯一的问题是几分钟后,它就停止工作了。当我按键时,它会停止打电话。
我无法将其锁定,但是它总是至少需要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);
}
谢谢!
解决方案
我认为,雪豹中有一个错误,可以阻止您的听众。
在您的键盘处理程序中,检查以下类型,然后重新启用侦听器。
if (type == kCGEventTapDisabledByTimeout) {
NSLog(@"Event Taps Disabled! Re-enabling");
CGEventTapEnable(eventTap, true);
return event;
}
不隶属于 StackOverflow