Cocoa NSStatusBar 全局快捷键

13

我创建了一个NSStatusBar可可应用程序,它坐落在系统状态栏中。

我想分配一个快捷键,以便按下后切换到我的应用并显示菜单。

这是否可能? 在我的搜索和实验中,我发现了几种不同的方法来分配全局快捷键,可以在您的应用程序处于后台时按下,但我找不到任何以编程方式使菜单显示的方法。

这是否可能? 如果有人认为分配全局快捷键的方法最好,请发布它。

谢谢。


我找到的其中一篇快捷键教程是在http://dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily/,供感兴趣的读者参考。


除非菜单被点击或“拆开”,否则没有显示菜单的理由。 - Azeem.Butt
2个回答

16

如果您的目标是10.6+,那么有一些新的API可以使用NSEvent进行全局热键设置。要了解更多信息,请查看这篇绝妙的博客文章:http://cocoakids.net/global-hotkeys-in-cocoa-on-snow-leopard

编辑(很久以后)

自吹自擂一下:我无法像预期的那样让 PTHotKey 和其他库正常工作,所以最终放弃并编写了自己的 HotKey 封装。它具有非常简单的API(您提供一个键码、修饰键、目标和操作),甚至支持有趣的东西,如10.6的块。您可以在这里下载源代码: http://github.com/davedelong/DDHotKey


@Craig,你可以执行[myStatusItem popUpStatusItemMenu:[myStatusItem menu]],但这样不会突出显示你的状态栏项目(这很糟糕)。我唯一能建议的另一件事可能是模拟单击状态栏项目。 - Dave DeLong
1
http://cocoakids.net/global-hotkeys-in-cocoa-on-snow-leopard 现在已经是一个停放的域名。 - apaderno
@kiamlaluno:使用NSEvent事件监视器方法来设置热键并不是最好的选择,因为你会得到每个按键事件,并且必须自己匹配按键。最好使用Carbon Events(请参见我的答案)或其中一个包装器,例如DDHotKey。 - Peter Hosey
@PeterHosey 我指的是这个答案中使用的链接,现在已经失效了。 - apaderno
@PeterHosey 我明白了,但我只是想指出答案的前半部分已经没有帮助了,因为它引用了一个失效的链接。我并没有说哪种方法更可取。 - apaderno
显示剩余2条评论

10

有一个实际的热键API, 它在Snow Leopard中仍然存在,并且在64位模式下可用。它是专门为此目的设计的,而NSEvent方法本质上只是CGEventTaps的基于块的包装。

区别在于NSEvent方法(或直接使用CGEventTaps)要求您查看每个事件,而热键API仅在用户按下您的热键时调用您的函数。


谢谢,这很有效。你知道是否可能通过代码弹出应用程序菜单吗? - Craig
Craig:是的。请看Dave DeLong在他的回答中的评论。 - Peter Hosey
1
JFYI:目前苹果已将这些方法标记为过时,因此不应再使用。 - Nickolay Olshevsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接