2013-02-28 3 views
2

Я использую DDHotKey, чтобы отслеживать некоторые слабые сочетания клавиш в системе. Когда событие запущено, только мое приложение получает его. Можно ли наблюдать это, не препятствуя доставке события в исходное целевое приложение?DDHotKey - Отслеживание без отмены события


Вот как этот модуль регистрирует обработчик события:

InstallApplicationEventHandler(&dd_hotKeyHandler, 1, &eventSpec, NULL, NULL); 

И сам обработчик событий:

OSStatus dd_hotKeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) { 
    @autoreleasepool { 
     EventHotKeyID hotKeyID; 
     GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID),NULL,&hotKeyID); 

     UInt32 keyID = hotKeyID.id; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hotKeyID = %u", keyID]; 
     NSSet *matchingHotKeys = [[DDHotKeyCenter sharedHotKeyCenter] hotKeysMatchingPredicate:predicate]; 
     if ([matchingHotKeys count] > 1) { NSLog(@"ERROR!"); } 
     DDHotKey *matchingHotKey = [matchingHotKeys anyObject]; 

     NSEvent *event = [NSEvent eventWithEventRef:theEvent]; 
     NSEvent *keyEvent = [NSEvent keyEventWithType:NSKeyUp 
              location:[event locationInWindow] 
             modifierFlags:[event modifierFlags] 
              timestamp:[event timestamp] 
             windowNumber:-1 
               context:nil 
              characters:@"" 
          charactersIgnoringModifiers:@"" 
              isARepeat:NO 
               keyCode:[matchingHotKey keyCode]]; 

     [matchingHotKey invokeWithEvent:keyEvent]; 
    } 

    return noErr; 
} 

ответ

4

Нет, вся точка горячих клавиш функциональность что событие проглотило приложение, которое регистрирует ключ.

Вы хотите получить global event monitor, что позволит вам наблюдать за событиями, происходящими в любом месте в системе, но не влиять на них.

[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask 
             handler:^(NSEvent * event){ 
    // See if the key is the one you want and act on it. 
}]; 
+0

Мониторинг глобальных событий работает только в том случае, если доступность включена, что я не хочу, чтобы мои пользователи беспокоились. –

+1

Нет никакого способа обойти это (кроме запуска от root). Существует три способа глобально увидеть ключевые события в OS X: горячие клавиши Carbon, мониторы CGEventTap's и 'NSEvent' (которые, как я подозреваю, являются обертками вокруг первого. Оба последних требуют доступности для включения. –

+0

А, я Я думал, что есть некоторые обходные пути. Спасибо в любом случае. –