Проблема Tap Event (CFMachPortRef) для Hot Key - обратный вызов не вызывается - PullRequest
3 голосов
/ 03 марта 2011

Я разрабатываю настольное приложение, которое поддерживает одну из функций через горячую клавишу. Я использую 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
}

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Я бы пропустил событие 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) {
    //...
}
0 голосов
/ 08 марта 2014

Решение вашей проблемы, скорее всего, описано в верхнем ответе на на этот вопрос . Я бы пометил этот вопрос как дурак, если бы у меня был счет для повторения.

...