Как вы реализуете глобальные зацепки клавиатуры в Mac OS X?

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

2 ответа

Решение

Взгляни на addGlobalMonitorForEventsMatchingMask:handler: методы класса NSEvent, Также вам может пригодиться Shortcut Recorder.

Это не (пока?) Поддерживается в Какао. Вы все еще можете использовать старую библиотеку 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, чтобы найти его).

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

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

Другие вопросы по тегам