2011-01-26 16 views
7

Come registrare un hotkey globale in Objective-C/Cocoa (Mac)?Registrati Hotkey

Ad esempio, il tasto di scelta rapida mi piacerebbe registrare sarebbe Alt - Cmd - D

Qualsiasi aiuto sarebbe apprezzato!

+3

perché grassetto ... Abbiamo tag per questo ;) – nacho4d

+4

Si prega di tenere presente che l'utilizzo di "alt-D" a livello globale non è l'idea migliore, in quanto di solito genera un carattere valido (∂) e potrebbe essere già definito in altre applicazioni (i tasti di accesso in Safari sono un esempio). Inoltre, un utente Mac comune si aspetta di avere almeno "cmd" come chiave di modifica nelle scorciatoie. – Asmus

+0

@Asmus: +1, e idealmente il "tasto di scelta rapida" deve essere anch'esso configurabile dall'utente. –

risposta

10

C'è un comodo wrapper Cocoa per le funzioni di Carbon richieste su GitHub: JFHotkeyManager. È anche possibile utilizzare la nuova (a partire dal 10.6) API NSEvent addGlobalMonitorForEventsMatchingMask:handler:, ma ottiene solo gli eventi chiave se l'accesso per i dispositivi di assistenza è abilitato.

+1

Wowza ... Prende persino NSStrings come [hkm bind: @ "alt command d" target: self action: @selector (show :)]; . =) –

4

Si desidera utilizzare le funzioni InstallApplicationEventHandler e RegisterEventHotKey dal framework Carbon. Questo blog post fornisce un ottimo how-to (è quello che ho usato quando stavo immaginando questa roba).

7

ho scritto una classe wrapper per rendere questo un diavolo di un molto più facile ...

https://github.com/davedelong/DDHotKey

+1

Puoi spiegare le API che hai usato in quel codice. Come se stessi cercando di usare 'addGlobalMonitor' quando i dispositivi di assistenza non sono abilitati, ma sto avendo un momento difficile. 'CGEventTap' è un'opzione quando i dispositivi di assistenza non sono abilitati? – Noitidart

+1

@Noitidart l'hai capito? Perché non l'ho fatto. Mi chiedo perché qualcuno dovrebbe passare il tempo a scrivere un bel wrapper per rendere un compito un po 'più facile senza spiegare come usarlo. – user3496846

+1

Totalmente d'accordo con te @ user3496846 - Sì, l'ho capito, entrambi i metodi CG e objc sono limitati da accessibilità, se vuoi registrare un tasto di scelta rapida devi usare il metodo Carbon RegisterHotKey - https://developer.apple.com /legacy/library/documentation/Carbon/Reference/CarbonFrameworkReference/index.html#//apple_ref/doc/uid/TP40004336 – Noitidart

4

qui si va:

#import <Carbon/Carbon.h> 

EventHandlerUPP hotKeyFunction; 

pascal OSStatus hotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData) 
{  
    FooBar *obj = userData; 
    [obj foo];  
    return noErr; 
} 

@implementation FooBar 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     //handler 
     hotKeyFunction = NewEventHandlerUPP(hotKeyHandler); 
     EventTypeSpec eventType; 
     eventType.eventClass = kEventClassKeyboard; 
     eventType.eventKind = kEventHotKeyReleased; 
     InstallApplicationEventHandler(hotKeyFunction,1,&eventType,self,NULL); 
     //hotkey 
     UInt32 keyCode = 80; //F19  
     EventHotKeyRef theRef = NULL; 
     EventHotKeyID keyID; 
     keyID.signature = 'FOO '; //arbitrary string 
     keyID.id = 1; 
     RegisterEventHotKey(keyCode,0,keyID,GetApplicationEventTarget(),0,&theRef); 

    }   
    return self; 
} 

- (void)foo 
{ 

} 

@end 
+0

ha funzionato perfettamente! – atomikpanda

Problemi correlati