gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:25:28 25 4
gpt4 key购买 nike

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

我无法锁定它,但它总是需要至少 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);
}

谢谢!

最佳答案

我认为 Snow Leopard 中存在一个错误,如果出现超时,该错误会阻止您的监听器。

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

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

关于objective-c - 应用程序随机停止接收按键(CGEventTaps),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4727149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com