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 全局热键的主要内容,如果未能解决你的问题,请参考以下文章