如何在Mac OS X中实现全局键盘挂钩?

时间:2010-05-24 05:17:59

标签: macos keyboard-hook

我知道这可以在Windows上完成,XGrabKey可以用于X11,但是Mac OS X呢?我想创建一个类,允许设置即使在应用程序窗口处于非活动状态时也可以调用的快捷键。

2 个答案:

答案 0 :(得分:3)

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即可找到它。)

如果你想要多个热键,或者你想从你的处理程序中调用方法,你还需要做更多的工作,但这一切都在这个答案顶部附近的链接中。

我一直在寻找这个问题的简单答案,所以我希望这有助于其他人...

答案 1 :(得分:2)

查看addGlobalMonitorForEventsMatchingMask:handler:的{​​{1}}类方法。您也可以找到Shortcut Recorder方便。