【问题标题】:How do you implement global keyboard hooks in Mac OS X?您如何在 Mac OS X 中实现全局键盘挂钩?
【发布时间】:2010-05-24 05:17:59
【问题描述】:

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

【问题讨论】:

    标签: macos keyboard-hook


    【解决方案1】:

    这在 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 谢谢!如果你有时间,我在这里问了一个相关问题stackoverflow.com/q/20169242/830899
    • 我确认这是注册全局热键的正确方法,我刚刚完成了。不过,我无法在生成的线程上执行此操作,我必须在“主线程”中执行此操作。是否可以从生成的线程中执行此操作?
    【解决方案2】:

    看看NSEventaddGlobalMonitorForEventsMatchingMask:handler: 类方法。您也可以方便地找到Shortcut Recorder

    【讨论】:

    • 这不适用于全局事件,除非启用了可访问性。 RegisterEventHotKeyInstallEventHandler 是以下解决方案中的方法,因为即使未启用可访问性也可以。我听说启用可访问性会导致性能下降。
    • 那么答案已经快 6 岁了。所以它可能不再起作用了。
    • 它有效,但它不是全球性的。如果您启用了可访问性,它可以是全局的。我在这里提到其他偶然发现此问题的读者的信息。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多