Я использую 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;
}
Мониторинг глобальных событий работает только в том случае, если доступность включена, что я не хочу, чтобы мои пользователи беспокоились. –
Нет никакого способа обойти это (кроме запуска от root). Существует три способа глобально увидеть ключевые события в OS X: горячие клавиши Carbon, мониторы CGEventTap's и 'NSEvent' (которые, как я подозреваю, являются обертками вокруг первого. Оба последних требуют доступности для включения. –
А, я Я думал, что есть некоторые обходные пути. Спасибо в любом случае. –