当我的应用程序不在最前面时,如何在NSStatusWindowLevel窗口中获取键盘事件?

时间:2008-11-27 15:27:46

标签: cocoa macos

创建半透明窗口(based on example code by Matt Gemmell)后,我想在此窗口中获取键盘事件。当我的应用程序是活动应用程序时,似乎只有键盘事件,而我想要键盘事件,即使我的应用程序未激活但窗口可见。

基本上我想要Quicksilver应用程序(blacktree)提供的行为。

有没有人对如何做到这一点有任何暗示?

3 个答案:

答案 0 :(得分:3)

有两种选择:

  1. 使用GetEventMonitorTarget()添加固定碳运行循环来抓取键盘事件。示例代码可在CocoaDev的this page获得。

  2. 使用CGEventTapCreate注册事件陷阱。示例代码可以在Apple开发人员邮件列表的this thread中找到。

编辑:请注意,只有在“Universal Access”偏好设置面板中选中“为辅助设备启用访问权限”时,这些方法才有效。

答案 1 :(得分:1)

可能更适合您的更简单的路线是让您的应用仅限背景。关于LSUIElement plist键的CocoaDev的讨论解释了如何设置它。基本上,您的应用程序不会出现在Dock或应用程序切换器中,并且在激活时不会替换当前应用程序的菜单栏。从用户的角度来看,它永远不是“活动”应用程序,但是您打开的任何窗口都可以被激活并正常响应事件。唯一需要注意的是,您永远不会显示您的菜单栏,因此您可能需要设置一个NSStatusItem(显示在菜单栏右侧的其中一个图标菜单)来控制(即退出) ,提出prefs等)你的申请。

编辑:我完全忘记了Interface Builder中的非激活面板复选框。您需要使用NSPanel而不是NSWindow来获得此选择。此设置可让您的面板接受点击和键盘输入而无需激活您的应用程序。我打赌这个设置和Carbon Hot Keys API的混合是QuickSilver用于他们的UI。

答案 2 :(得分:0)

更新:
苹果实际上似乎已经从10.5 BTW(我最近升级并且我的示例代码不像以前那样工作)再次改变了一切。

现在,您确实只能捕获设置事件点击的keydown事件,如果您是root或辅助设备已启用,无论您计划捕获哪个级别,无论您是否选择捕获(这允许您修改甚至丢弃事件)或只听。当标志发生变化(实际上甚至更改这些)和其他事件时,您仍然可以获取信息,但在其他任何情况下都不能进行keydown。

然而,使用碳事件处理程序和方法RegisterEventHotKey()允许您注册一个热键,并且在按下它时会收到通知,您既不需要是root用户也不需要启用辅助设备的任何东西。我认为Quicksilver可能正是这样做的。

相关问题