2009-06-27 6 views
6

Ich bin ziemlich neu in der OSX-Entwicklung, so dass dies einfach sein kann, aber Google war nicht hilfreich.Bindung an Media-Tasten auf Apple-Tastaturen unter OSX 10.5

Ich versuche, eine Aktion an die Medientasten zu binden, die Sie auf neueren Apple-Tastaturen finden (Wiedergabe, Pause, usw.). Es scheint, dass Sie diese Tasten nicht mit der normalen Hotkey-API binden können, aber es muss möglich sein, da iTunes klar verwaltet. Gibt es eine knifflige undokumentierte API, die das erreicht? Jede Hilfe würde sehr geschätzt werden.

Antwort

7

Nach weiterem googeln scheint dieses http://www.rogueamoeba.com/utm/2007/09/29/ das Problem anzugehen. Es gibt keine einfache Lösung, aber wenn Sie eine echte Cocoa-App entwickeln, scheint dies zumindest möglich.

+0

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

4

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.

+0

Dies ist auch die Schlussfolgerung, dass ich kam, aber iTunes ist eindeutig in es SOMEHOW, es sei denn, es gibt eine fest codierte Ausnahme für iTunes irgendwo tief im Kernel? Ich würde das merkwürdig finden ... – tryx