Domanda

Sono abbastanza nuovo nello sviluppo di OSX, quindi potrebbe essere facile ma google non è stato utile.

Sto cercando di associare un'azione ai tasti multimediali che trovi sulle tastiere Apple più recenti (Riproduci, Pausa, ecc.). Sembra che non puoi associare questi tasti usando l'API di tasti di scelta rapida normale, ma deve essere possibile poiché iTunes gestisce chiaramente. Esiste un'API non documentata complicata che raggiunge questo obiettivo? Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Dopo una più ampia ricerca su Google, questo http://www.rogueamoeba.com/ utm / 2007/09/29 / sembra affrontare il problema. Non esiste una soluzione semplice, ma se stai sviluppando una vera app Cocoa, questo sembra almeno possibile.

Altri suggerimenti

Dalle mie indagini, il sistema operativo sta intercettando quegli eventi chiave prima che siano disponibili per altri processi. Ho creato un CGEventTap, in questo modo:

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);

}

E quindi il callback dell'evento effettivo è questo:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    if (type == kCGEventKeyUp) {
        CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
        NSLog(@"%d", keycode);
    }

    return event;
}

Quello che vedi registrato sulla console è che ottieni normali metodi di registro per i tasti funzione (se stai tenendo premuto il tasto " fn "), ma quando premi i tasti multimediali , luminosità, volume o espulsione dei tasti, niente viene registrato.

Quindi da questo sembra purtroppo che non ci sia modo di catturare un evento chiave multimediale. Tuttavia, mi piacerebbe essere smentito.

EDIT: ho dimenticato di sottolineare che per far funzionare tutto questo deve essere eseguito come root, oppure è necessario attivare l'accesso per i dispositivi di assistenza nella " Accesso universale " riquadro delle Preferenze di Sistema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top