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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top