¿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!
¿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!
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.
Wowza ... Incluso toma NSStrings como [hkm bind: @ "alt command d" target: acción propia: @selector (show :)]; . =) –
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).
escribí una clase contenedora para hacer de este un diablos de mucho más fácil ...
¿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
@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
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
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
¡Funcionó a la perfección! – atomikpanda
qué negritas ... Tenemos etiquetas para que ;) – nacho4d
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
@ Asmus: +1, e idealmente la "tecla de acceso rápido" también debe ser configurable por el usuario. –