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