5

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

4

2 回答 2

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

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

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

于 2013-04-17T14:02:06.603 回答
2

看看addGlobalMonitorForEventsMatchingMask:handler:类方法NSEvent。您也可能会发现快捷方式记录器很方便。

于 2010-05-24T05:24:59.377 回答