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!
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!
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.
Wowza ... Prende persino NSStrings come [hkm bind: @ "alt command d" target: self action: @selector (show :)]; . =) –
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).
ho scritto una classe wrapper per rendere questo un diavolo di un molto più facile ...
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
@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
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
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
ha funzionato perfettamente! – atomikpanda
perché grassetto ... Abbiamo tag per questo ;) – nacho4d
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
@Asmus: +1, e idealmente il "tasto di scelta rapida" deve essere anch'esso configurabile dall'utente. –