【发布时间】:2010-05-24 05:17:59
【问题描述】:
我知道这可以在 Windows 上完成,XGrabKey 可以用于 X11,但是 Mac OS X 呢?我想创建一个类,允许设置即使在应用程序窗口处于非活动状态时也可以调用的快捷键。
【问题讨论】:
标签: macos keyboard-hook
我知道这可以在 Windows 上完成,XGrabKey 可以用于 X11,但是 Mac OS X 呢?我想创建一个类,允许设置即使在应用程序窗口处于非活动状态时也可以调用的快捷键。
【问题讨论】:
标签: macos keyboard-hook
这在 Cocoa 中(还没有?)支持。您仍然可以为此使用旧的 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 中定义,因此您可以在那里四处寻找其他键(只需在 XCode 中按 CMD + Shift + O,然后键入 Events.h 即可找到它)。
如果您想要多个热键或想要从处理程序调用方法,则必须做更多的工作,但这一切都在此答案顶部附近的链接中。
我一直在寻找这个问题的简单答案,所以我希望这对其他人有所帮助......
【讨论】:
看看NSEvent 的addGlobalMonitorForEventsMatchingMask:handler: 类方法。您也可以方便地找到Shortcut Recorder。
【讨论】:
RegisterEventHotKey 和 InstallEventHandler 是以下解决方案中的方法,因为即使未启用可访问性也可以。我听说启用可访问性会导致性能下降。