Pregunta

Soy bastante nuevo en el desarrollo de OSX, por lo que esto puede ser fácil, pero google no ha sido útil.

Estoy intentando vincular una acción a las teclas multimedia que encuentras en los teclados Apple más nuevos (Reproducir, Pausa, etc.). Parece que no puede vincular estas teclas utilizando la API de teclas de acceso rápido normal, pero debe ser posible ya que iTunes claramente lo logra. ¿Hay alguna API no documentada complicada que logre esto? Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

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

Otros consejos

De mis investigaciones, el sistema operativo está atrapando esos eventos clave antes de que estén disponibles para otros procesos. Creé 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 del evento real es esta:

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 ve registrado en la consola es que obtiene métodos de registro normales para las teclas de función (si mantiene presionada la tecla " fn " también), pero al presionar las teclas multimedia , brillo, volumen o teclas de expulsión, nada se registra.

Entonces, a partir de esto, desafortunadamente parece que no hay forma de capturar un evento clave de medios. Sin embargo, me encantaría que me demuestren lo contrario.

EDITAR: Olvidé señalar que para que esto funcione, debe ejecutarse como root, o debe activar el acceso para dispositivos de asistencia en " Universal Access " panel de Preferencias del sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top