OSX-клавиатура с ярлыком фонового приложения, как

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

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

Ответ 1

Посмотрите на Dave DeLong DDHotKey класс на GitHub.

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

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

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

Ответ 2

Если вы хотите получить к нему доступ в настройках, используйте шаблон панели предпочтений. Если вы хотите его в строке состояния, создайте обычное приложение, установите для ключа 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
}