2011-01-09 22 views
13

Quiero mi solicitud OSX para sentarse en el fondo y esperar a que un atajo de teclado para entrar en acción. Debe ser configurable similar a Growl en las preferencias, o accesible como Dropbox en la barra de estado.OSX aplicación de fondo atajo de teclado, cómo

  • ¿Qué tipo de plantilla xcode debo usar?
  • ¿Cómo capturo atajos de teclado a nivel mundial?

Respuesta

11

Si desea acceder a él en las preferencias, utilice la plantilla del Panel de preferencias. Si lo quiere en la barra de estado, cree una aplicación normal, establezca la clave LSUIElement en 1 en Info.plist y use NSStatusItem para crear el elemento.

Para capturar los accesos directos a nivel mundial, es necesario incluir el marco de carbono también. Use RegisterEventHotKey y UnregisterEventHotKey para registrarse en los eventos.

OSStatus HotKeyEventHandlerProc(EventHandlerCallRef inCallRef, EventRef ev, void* inUserData) { 
    OSStatus err = noErr; 
    if(GetEventKind(ev) == kEventHotKeyPressed) { 
     [(id)inUserData handleKeyPress]; 
    } else if(GetEventKind(ev) == kEventHotKeyReleased) { 
     [(id)inUserData handleKeyRelease]; 
    } else err = eventNotHandledErr; 
    return err; 
} 

//EventHotKeyRef hotKey; instance variable 

- (void)installEventHandler { 
    static BOOL installed = NO; 
    if(installed) return; 
    installed = YES; 
    const EventTypeSpec hotKeyEvents[] = {{kEventClassKeyboard,kEventHotKeyPressed},{kEventClassKeyboard,kEventHotKeyReleased}}; 
    InstallApplicationEventHandler(NewEventHandlerUPP(HotKeyEventHandlerProc),GetEventTypeCount(hotKeyEvents),hotKeyEvents,(void*)self,NULL); 
} 

- (void)registerHotKey { 
    [self installEventHandler]; 
    UInt32 virtualKeyCode = ?; //The virtual key code for the key 
    UInt32 modifiers = cmdKey|shiftKey|optionKey|controlKey; //remove the modifiers you don't want 
    EventHotKeyID eventID = {'abcd','1234'}; //These can be any 4 character codes. It can be used to identify which key was pressed 
    RegisterEventHotKey(virtualKeyCode,modifiers,eventID,GetApplicationEventTarget(),0,(EventHotKeyRef*)&hotKey); 
} 
- (void)unregisterHotKey { 
    if(hotkey) UnregisterEventHotKey(hotKey); 
    hotKey = 0; 
} 

- (void)handleHotKeyPress { 
    //handle key press 
} 
- (void)handleHotKeyRelease { 
    //handle key release 
} 
13

Tener un vistazo a la clase de Dave DeLong DDHotKey en GitHub.

DDHotKey es una clase Cocoa fácil de usar para registrar una aplicación que responde a eventos clave del sistema, o "teclas rápidas".

Una tecla de acceso directo global es una combinación de teclas que siempre se ejecuta una acción específica, independientemente de la aplicación es más frontal. Por ejemplo, la tecla de acceso directo predeterminada de Mac OS X de "espacio de comando" muestra la barra de búsqueda de Spotlight, incluso si el Finder no es la aplicación más cercana.

Una licencia generoso también.

+3

1 buena respuesta :) –

Cuestiones relacionadas