我正在开发一个通过热键支持其中一项功能的桌面应用程序。我正在使用 Event Tap 为此工作。
但是,有时(随机地)不调用回调;热键不起作用,因此该功能似乎不起作用。
如何确定这里的问题?
以下是代码片段:
-( void )startEventTapinThread //Called in a separate thread.
{
NSAutoreleasePool *pool =[ [ NSAutoreleasePool alloc] init];
CFRunLoopRef runloop =(CFRunLoopRef)CFRunLoopGetCurrent();
CGEventMask interestedEvents = CGEventMaskBit(kCGEventFlagsChanged)|CGEventMaskBit(kCGEventKeyDown);
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, interestedEvents, myCGEventCallback, self); //self is the object pointer our method
CFRunLoopSourceRef source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource((CFRunLoopRef)runloop , source, kCFRunLoopCommonModes);
CFRunLoopRun();
[ pool release];
}
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
CGEventType eventType = CGEventGetType(event);
//execute the code related to feature
}
我会通过事件
kCGEventMaskForAllEvents
而不是只为某些事件设置挂钩。
然后,在你的回调函数中,过滤事件。
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type == kCGEventTapDisabledByTimeout) {
NSLog(@"Event Taps Disabled! Re-enabling");
CGEventTapEnable(eventTap, true);
return event;
}
if (type == kCGEventLeftMouseDown) {
//...
}
if (type != kCGEventKeyDown) {
//...
}
if (type == kCGEventKeyDown) {
//...
}
您的问题的解决方案很可能在这个问题的最佳答案中描述。如果我有这样的代表分数,我会把这个问题标记为一个骗局。