2011-01-26 18 views
7

¿Cómo registraría una tecla de acceso rápido global en Objective-C/Cocoa (Mac)?Registrar Hotkey

Por ejemplo, la tecla de acceso directo que me gustaría registrar sería Alt - Cmd - D

se agradecería cualquier ayuda!

+3

qué negritas ... Tenemos etiquetas para que ;) – nacho4d

+4

Tenga en cuenta que usar "alt-D" globalmente no es la mejor idea, ya que normalmente genera un carácter válido (∂) y podría estar ya definido en otras aplicaciones (las claves de acceso en Safari son un ejemplo). Además, un usuario común de Mac espera tener al menos "cmd" como una tecla modificadora en accesos directos. – Asmus

+0

@ Asmus: +1, e idealmente la "tecla de acceso rápido" también debe ser configurable por el usuario. –

Respuesta

10

Hay una conveniente envoltura de cacao para las funciones de carbono requeridas en GitHub: JFHotkeyManager. También puede usar la nueva (desde 10.6) NSEvent API addGlobalMonitorForEventsMatchingMask:handler:, pero solo obtiene eventos clave si el acceso para dispositivos de asistencia está habilitado.

+1

Wowza ... Incluso toma NSStrings como [hkm bind: @ "alt command d" target: acción propia: @selector (show :)]; . =) –

4

Querrá utilizar las funciones InstallApplicationEventHandler y RegisterEventHotKey de la estructura de carbono. Este blog post da una buena forma de cómo hacerlo (es lo que usé cuando estaba pensando en estas cosas).

7

escribí una clase contenedora para hacer de este un diablos de mucho más fácil ...

https://github.com/davedelong/DDHotKey

+1

¿Puede explicar las API que utilizó en ese código? Como si estuviera tratando de usar 'addGlobalMonitor' cuando los dispositivos de asistencia no están habilitados, pero estoy teniendo dificultades. ¿'CGEventTap' es una opción cuando los dispositivos de asistencia no están habilitados? – Noitidart

+1

@Noitidart ¿Lo has descubierto? Porque no lo hice Me pregunto por qué alguien pasaría el tiempo escribiendo un buen envoltorio para facilitar muchísimo la tarea sin explicar cómo usarla. – user3496846

+1

Totalmente de acuerdo con usted @ user3496846 - Sí, me di cuenta, tanto los métodos CG como objc están limitados por la accesibilidad, si desea registrar una tecla de acceso rápido, debe usar el método Carbon RegisterHotKey - https://developer.apple.com /legacy/library/documentation/Carbon/Reference/CarbonFrameworkReference/index.html#//apple_ref/doc/uid/TP40004336 – Noitidart

4

Aquí van:

#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

¡Funcionó a la perfección! – atomikpanda