Как вы реализуете глобальные зацепки клавиатуры в Mac OS X? - PullRequest
5 голосов
/ 24 мая 2010

Я знаю, что это можно сделать для Windows и что XGrabKey можно использовать для X11, но как насчет Mac OS X?Я хочу создать класс, который позволяет устанавливать сочетания клавиш, которые можно вызывать, даже когда окна приложения неактивны.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2013

Это не (пока?) Поддерживается в Какао. Вы все еще можете использовать старую библиотеку Carbon для этого (которая совместима с 64 битами), но, к сожалению, Apple решила удалить всю документацию по этому вопросу.

Здесь есть хорошая статья в блоге: http://dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily/

Статья немного длинная на мой вкус, поэтому вот короткая версия:

- (id)init {
    self = [super init];
    if (self) {
        EventHotKeyRef  hotKeyRef;
        EventHotKeyID   hotKeyId;
        EventTypeSpec   eventType;

        eventType.eventClass    = kEventClassKeyboard;
        eventType.eventKind     = kEventHotKeyPressed;

        InstallApplicationEventHandler(&mbHotKeyHandler, 1, &eventType, NULL, NULL);

        hotKeyId.signature  = 'hotk';
        hotKeyId.id         = 1337;

        RegisterEventHotKey(kVK_ANSI_C, cmdKey + shiftKey, hotKeyCopyId, GetApplicationEventTarget(), 0, &hotKeyRef);
    }
}

OSStatus mbHotKeyHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData) {
    // Your hotkey was pressed!     
    return noErr;
}

Горячая клавиша зарегистрирована при вызове RegisterEventHotKey(…). В этом случае регистрируется CMD + Shift + C.

Ключи ANSI определены в HIToolbox / Events.h, поэтому вы можете посмотреть другие ключи (просто нажмите CMD + Shift + O в XCode и введите Events.h, чтобы найти его).

Вам нужно проделать немного больше работы, если вам нужно несколько горячих клавиш или если вы хотите вызывать методы из своего обработчика, но это все по ссылке в верхней части этого ответа.

Я искал простой ответ на этот вопрос, поэтому я надеюсь, что это поможет кому-то еще ...

2 голосов
/ 24 мая 2010

Взгляните на addGlobalMonitorForEventsMatchingMask:handler: методы класса NSEvent. Также вы можете найти Ярлык быстрого доступа удобный.

...