A ligação às teclas de mídia em teclados Apple sob OSX 10.5 [fechado]
Pergunta
Eu sou bastante novo para o desenvolvimento OSX, então isso pode ser fácil, mas o Google não tenha sido útil.
Estou tentando ligar uma ação para as teclas de mídia que você encontrar em teclados mais recentes da Apple (reproduzir, pausar, etc). Parece que você não pode ligar a estas chaves usando a API hotkey regular, mas deve ser possível desde iTunes administra claramente. Existe alguma API não documentada complicado que consegue isso? Qualquer ajuda seria muito apreciada.
Solução
Depois de mais extensa googling, este http://www.rogueamoeba.com/ UTM / 2007/09/29 / parece resolver o problema. Não há uma solução fácil, mas se você estiver desenvolvendo um aplicativo de cacau real isso parece possível, pelo menos.
Outras dicas
De minhas investigações, o sistema operacional está prendendo esses eventos-chave antes de estarem disponíveis para outros processos. Eu criei um CGEventTap, assim:
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 então o callback evento real é esta:
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
O que você vê registradas para o console é que você começa métodos de log normais para as teclas de função (se você está segurando a tecla "Fn" também), mas ao pressionar as teclas de mídia, teclas de brilho, volume ou ejetar , nada está sendo registrado.
Assim, a partir disso, infelizmente, parece que não há nenhuma maneira de capturar uma mídia evento chave. No entanto, eu gostaria de estar errado provado.
EDIT:. Esqueci-me de salientar que para que isso funcione que tanto precisa ser executado como root, ou você precisa ativar o acesso para dispositivos de assistência no painel "Acesso Universal" das Preferências do Sistema