Question

Je suis assez nouveau dans le développement OSX. Cela peut donc être facile, mais Google n'a pas été utile.

J'essaie de lier une action aux touches de support que vous trouvez sur les claviers Apple les plus récents (Lecture, Pause, etc.). Il semble que vous ne puissiez pas lier ces clés à l’aide de l’API de raccourci clavier habituelle, mais cela doit être possible puisque iTunes le gère clairement. Existe-t-il une API non documentée délicate qui réalise cela? Toute aide serait la bienvenue.

Était-ce utile?

La solution

Après une recherche plus approfondie sur Google, cette http://www.rogueamoeba.com/ utm / 2007/09/29 / semble résoudre le problème. Il n’existe pas de solution simple, mais si vous développez une véritable application Cocoa, cela semble au moins possible.

Autres conseils

D'après mes enquêtes, le système d'exploitation capture ces événements clés avant qu'ils ne soient disponibles pour d'autres processus. J'ai créé un CGEventTap, comme suit:

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

}

Ensuite, le rappel d’événement réel est le suivant:

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

    return event;
}

Ce que vous voyez consigné dans la console, c'est que vous obtenez des méthodes de journalisation normales pour les touches de fonction (si vous maintenez la touche & enfoncée également!), mais lorsque vous appuyez sur les touches de support. , luminosité, volume ou touches d'éjection, rien n'est enregistré dans le journal.

Donc, il semble malheureusement qu'il n'y ait aucun moyen de capturer un événement de clé multimédia. Cependant, j'aimerais beaucoup avoir tort.

EDIT: j'ai oublié de préciser que, pour que cela fonctionne, il doit être exécuté en tant que root ou vous devez activer l'accès pour les périphériques d'assistance dans & "Accès universel &"; volet des Préférences Système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top