Mac OSX从MenuBar应用程序捕获所有按键

时间:2013-05-12 07:41:18

标签: macos keydown

我敢肯定大多数人都熟悉阿尔弗雷德这个令人敬畏的任务发射器。我想知道的是Alfred如何检测到我正在按下Command-Shift-Space来启动它的UI?它是否覆盖`keyDown'或完全不同的东西?

到目前为止,我所看到的每篇帖子都谈到了覆盖keyDown,但根据我的理解,该覆盖必须是视图的一部分。阿尔弗雷德如何在没有展示视图的情况下做到这一点,顶部只有菜单栏图标?

2 个答案:

答案 0 :(得分:0)

您可以使用NSEvent来监控全局按键。

  

您还可以创建一个全局事件监视器,它允许您监视其他应用程序中的事件,但您无法更改这些事件。

具体来说,请查看addGlobalMonitorForEventsMatchingMask:handler:,它会安装一个事件监视器,用于接收发布到其他应用程序的事件副本。

+ (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
  

事件以异步方式发送到您的应用程序,您只能观察事件;您无法修改或以其他方式阻止将事件传递到其原始目标应用程序。

     

如果启用了辅助功能,或者您的应用程序受信任以进行辅助功能访问,则只能监视与键相关的事件(请参阅AXIsProcessTrusted)。

如果您确实想要阻止或修改事件,则应该查看CGEvent

答案 1 :(得分:0)

我不知道Alfred是否要求信任可访问性,或者您是否愿意要求自己的应用程序。

无论哪种方式,您都可以使用旧的Carbon热键API,而不是使用-[NSEvent addGlobalMonitorForEventsMatchingMask:...]或事件点击。它仍然没有被弃用,尽管剩下的大部分是碳。请参阅RegisterEventHotKey()