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;
}


person Attila H    schedule 28.02.2013    source источник


Ответы (1)


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

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

[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask
                                       handler:^(NSEvent * event){
    // See if the key is the one you want and act on it.
}];
person jscs    schedule 28.02.2013
comment
Глобальный мониторинг событий работает, только если включена доступность, а я не хочу, чтобы мои пользователи беспокоились об этом. - person Attila H; 01.03.2013
comment
Обойти это невозможно (кроме запуска от имени пользователя root). Есть три способа глобального просмотра ключевых событий в OS X: горячие клавиши Carbon, мониторы CGEventTaps и NSEvent (которые, как я подозреваю, являются обертками вокруг первого. Оба последних требуют включения специальных возможностей. - person jscs; 01.03.2013
comment
Ах я вижу. Я думал, что есть некоторые обходные пути. В любом случае спасибо. - person Attila H; 01.03.2013