Из моих исследований операционная система захватывает эти ключевые события, прежде чем они будут доступны для других процессов. Я создал CGEventTap, например, так:
int main(int argc, char *argv[]) {
CFMachPortRef eventTap;
CFRunLoopSourceRef runLoopSource;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
if (!eventTap) {
NSLog(@"Couldn't create event tap!");
exit(1);
}
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
CFRelease(eventTap);
CFRelease(runLoopSource);
exit(0);
}
, а затем фактический обратный вызов события является следующим:
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
Что вы видите вход в консоль, что вы получите обычные методы журнала для функциональных клавиш (если вы также удерживаете клавишу «fn»), но при нажатии на клавиши мультимедиа, клавиши яркости, громкости или выталкивания ничего не регистрируется.
Таким образом, к сожалению, похоже, что невозможно зафиксировать событие медиа-ключа. Однако я хотел бы, чтобы меня оправдали.
EDIT: Я забыл указать, что для этого нужно либо запустить его как root, либо включить вспомогательные устройства в панели «Универсальный доступ» в разделе «Системные настройки».
Проблема в том, что iTunes не может реагировать на эти ключи - это неразумно использовать эти клавиши для управления вашим приложением. – adib