2009-06-27 6 views
6

Soy bastante nuevo en el desarrollo de OSX, así que esto puede ser fácil pero google no me ha ayudado.Encuadernación a teclas multimedia en teclados Apple bajo OSX 10.5

Estoy tratando de vincular una acción a las teclas multimedia que encuentre en los teclados Apple más nuevos (Reproducir, Pausa, etc.). Parece que no se puede unir a estas teclas usando la API de acceso rápido normal, pero debe ser posible ya que iTunes maneja claramente. ¿Hay alguna API difícil de documentar que logre esto? Cualquier ayuda sería muy apreciada.

Respuesta

7

Después de buscar en Google más a fondo, este http://www.rogueamoeba.com/utm/2007/09/29/ parece resolver el problema. No hay una solución fácil, pero si está desarrollando una aplicación Cocoa real, al menos esto parece posible.

+0

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

4

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.

+0

Esta es también la conclusión a la que llegué, sin embargo, iTunes se está enganchando claramente en ALGUNA VEZ, a menos que exista una excepción codificada para iTunes en alguna parte del núcleo. Me gustaría encontrar que extraño ... – tryx

Cuestiones relacionadas