Según mis investigaciones, el sistema operativo atrapa esos eventos clave antes de que estén disponibles para otros procesos. He creado un CGEventTap, así:
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);
}
Y luego la devolución de llamada acontecimiento real es la siguiente:
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
Lo que se ve conectado a la consola es que se llega métodos de registro normales para las teclas de función (si también está presionando la tecla "fn"), pero al presionar las teclas multimedia, el brillo, el volumen o las teclas de expulsión, se está registrando nada.
Por lo tanto, desafortunadamente, parece que no hay forma de capturar un evento de tecla multimedia. Sin embargo, me gustaría que se demuestre que estoy equivocado.
EDITAR: Olvidé señalar que para que esto funcione debe ejecutarse como root, o debe activar el acceso para dispositivos de asistencia en el panel "Acceso universal" de las Preferencias del Sistema.
El problema es que no hay forma de evitar que iTunes reaccione con estas teclas, lo que hace que no sea aconsejable utilizar estas teclas para controlar su aplicación. – adib