3

我正在开发一个桌面应用程序,它通过热键支持其中一项功能。我正在使用 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
}
4

2 回答 2

1

我会传递事件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) {
    //...
}
于 2011-09-13T08:15:58.787 回答
0

您的问题的解决方案很可能在此问题的最佳答案中有所描述。如果我有代表分数,我会将这个问题标记为欺骗。

于 2014-03-08T18:50:52.170 回答