14 Stimmen

OSX-Tastenkombinationen für Hintergrundanwendungen, wie man

Ich möchte, dass meine OSX-Anwendung im Hintergrund läuft und darauf wartet, dass ein Tastaturkürzel ausgeführt wird. Es sollte konfigurierbar sein, ähnlich wie Growl in den Einstellungen, oder zugänglich wie Dropbox in der Statusleiste.

  • Welche Art von Xcode-Vorlage muss ich verwenden?
  • Wie kann ich Tastaturkürzel global erfassen?

14voto

Abizern Punkte 137651

Werfen Sie einen Blick auf Dave DeLong's DDHotKey Klasse auf GitHub.

DDHotKey ist eine einfach zu bedienende Cocoa-Klasse zur Registrierung einer Anwendung, die auf Systemtastenereignisse oder "Hotkeys" reagiert.

Ein globaler Hotkey ist eine Tastenkombination, die immer eine bestimmte Aktion ausführt, unabhängig davon, welche Anwendung im Vordergrund steht. Der Mac OS X-Standard-Hotkey "Befehl-Leertaste" zeigt beispielsweise die Spotlight-Suchleiste an, auch wenn der Finder nicht das vorderste Programm ist.

Auch eine großzügige Lizenz.

11voto

ughoavgfhw Punkte 39353

Wenn Sie in den Einstellungen darauf zugreifen möchten, verwenden Sie die Vorlage Einstellungsfenster. Wenn Sie es in der Statusleiste haben möchten, erstellen Sie eine normale Anwendung, setzen Sie den Schlüssel LSUIElement in Info.plist auf 1 und verwenden Sie NSStatusItem, um das Element zu erstellen.

Um Shortcuts global zu erfassen, müssen Sie auch das Carbon-Framework einbeziehen. Verwenden Sie RegisterEventHotKey y UnregisterEventHotKey um sich für die Veranstaltungen anzumelden.

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
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X