Фоновое приложение сочетания клавиш OSX, как - PullRequest
13 голосов
/ 09 января 2011

Я хочу, чтобы мое OSX-приложение находилось в фоновом режиме и ждало, пока не заработает сочетание клавиш.Он должен быть настраиваемым, похожим на Growl в настройках, или доступен в виде выпадающего списка в строке состояния.

  • Какой шаблон xcode я должен использовать?
  • Как захватывать клавиатуруярлыки глобально?

Ответы [ 2 ]

13 голосов
/ 09 января 2011

Взгляните на класс DDHotKey Дэйва Делонга на GitHub.

DDHotKey - это простой в использовании класс Cocoa для регистрации приложения для реагирования на события системных клавиш или «горячие клавиши».

Глобальная горячая клавиша - это комбинация клавиш, которая всегда выполняет определенное действие, независимо от того, какое приложение находится на первом месте. Например, горячая клавиша Mac OS X по умолчанию «command-space» отображает панель поиска Spotlight, даже если Finder не является передним приложением.

Щедрая лицензия.

11 голосов
/ 09 января 2011

Если вы хотите получить к нему доступ в настройках, используйте шаблон панели настроек. Если вы хотите это в строке состояния, создайте обычное приложение, установите ключ LSUIElement на 1 в Info.plist и используйте NSStatusItem для создания элемента.

Чтобы перехватывать ярлыки по всему миру, вам также необходимо включить Carbon framework. Для регистрации событий используйте RegisterEventHotKey и UnregisterEventHotKey.

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
}
...