Von meinen Untersuchungen erfasst das Betriebssystem diese wichtigen Ereignisse, bevor sie für andere Prozesse verfügbar sind. Ich habe eine CGEventTap, etwa so:
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);
}
Und dann das eigentliche Ereignis Rückruf ist dies:
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
Was sehen Sie an der Konsole angemeldet ist, dass man normale Log-Methoden erhalten für Funktionstasten (wenn Sie auch die Taste "fn" gedrückt halten), aber wenn Sie die Medientasten, Helligkeit, Lautstärke oder Auswurftaste drücken, wird nichts protokolliert.
Daher scheint es leider, dass es keine Möglichkeit gibt, ein Medienschlüsselereignis zu erfassen. Allerdings würde ich gerne falsch bewiesen werden.
EDIT: Ich habe vergessen, darauf hinzuweisen, dass es entweder als root ausgeführt werden muss, oder Sie müssen den Zugriff für assistive Geräte im Bereich "Universal Access" der Systemeinstellungen aktivieren.
Problem ist, dass es keine Möglichkeit gibt, zu verhindern, dass iTunes von diesen Tasten reagiert - was es unklug macht, diese Tasten zu benutzen, um Ihre Anwendung zu steuern. – adib