Cocoa NSStatusBar 全局热键

Posted

技术标签:

【中文标题】Cocoa NSStatusBar 全局热键【英文标题】:Cocoa NSStatusBar Global HotKey 【发布时间】:2010-12-12 01:47:49 【问题描述】:

我创建了一个位于系统状态栏中的 NSStatusBar cocoa 应用程序。

我想分配一个热键,以便在按下它时切换我的应用程序并显示菜单。

这可能吗?,在我的搜索和实验中,我发现了几种不同的分配全局热键的方法,当您的应用程序在后台时可以按下这些热键,但我找不到任何方法来使菜单显示有问题.

这可能吗?,如果有人认为分配全局热键的方法最好,请发布。

谢谢。


我在http://dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily/ 上找到了一个热键教程,供任何感兴趣的人使用。

【问题讨论】:

没有理由显示菜单,除非它被点击或“撕下”。 【参考方案1】:

如果您的目标是 10.6+,NSEvent 的一些新 API 可以执行全局热键。欲了解更多信息,请查看这篇精彩的博文:http://cocoakids.net/global-hotkeys-in-cocoa-on-snow-leopard

编辑(很久以后)

有点自吹自擂:我永远无法让 PTHotKey 和其他库之类的东西按我期望的方式工作,所以我最终放弃并编写了自己的 HotKey 包装器。它有一个非常简单的 API(你给它一个键码、修饰符、一个目标和一个动作),甚至支持有趣的东西,比如 10.6 的块。你可以在这里下载源码:http://github.com/davedelong/DDHotKey

【讨论】:

感谢您的博文,它工作得很好,但我认为我使用另一个示例,因此它也可以在 10.5 中工作,您知道是否可以通过代码弹出应用程序菜单? @Craig 你可以做[myStatusItem popUpStatusItemMenu:[myStatusItem menu]],虽然这不会突出你的状态项(这是蹩脚的)。我建议的唯一另一件事可能是假点击状态项。 cocoakids.net/global-hotkeys-in-cocoa-on-snow-leopard 现在将您带到一个停放的域。 @kiamlaluno:无论如何,对热键使用 NSEvent 事件监控器方法并不是那么好,因为您得到 每个 键事件并且必须自己匹配键。最好使用 Carbon 事件(请参阅我的回答)或其中一个包装器,例如 DDHotKey。 @PeterHosey 我指的是这个答案中使用的链接,现在没有带到任何地方。【参考方案2】:

有 an actual hotkey API,它仍然存在于 Snow Leopard 中,并提供 64 位版本。它是专门为此目的而设计的,与 NSEvent 方法不同,NSEvent 方法本质上只是一个基于块的 CGEventTaps 包装器。

不同之处在于 NSEvent 方法(或直接 CGEventTaps)让您查看进入的每个事件,而热键 API 仅在用户按下 您的时调用您的函数em> 热键。

【讨论】:

谢谢你,效果很好,你知道是否可以通过代码弹出应用程序菜单吗? 克雷格:是的。请参阅 Dave DeLong 对他的回答的评论。 JFYI:现在 Apple 将此方法标记为已过时,因此不应再使用它们

以上是关于Cocoa NSStatusBar 全局热键的主要内容,如果未能解决你的问题,请参考以下文章

全局拦截热键,但保持原始行为

替换全局热键

从 Winforms 应用程序发送全局击键/伪造全局热键

如何通过辅助功能 API 获取当前选定文本的全局屏幕坐标。

在 golang 中实现全局热键?

模拟全局热键