代码之家  ›  专栏  ›  技术社区  ›  Kristof Van Landschoot

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

  •  5
  • Kristof Van Landschoot  · 技术社区  · 17 年前

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

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

    有人对如何做到这一点有任何提示吗?

    3 回复  |  直到 17 年前
        1
  •  3
  •   James Eichele Bernard Igiri    17 年前

    有两种选择:

    1. 使用 GetEventMonitorTarget() 通过一个固定的碳纤维跑步环来抓取键盘事件。示例代码可在 this page 在CocoaDev。

    2. 将事件陷阱注册到 CGEventTapCreate 。示例代码可在中找到 this thread 来自苹果开发者的邮件列表。

    编辑: 请注意,只有在“通用访问首选项”窗格中勾选“启用辅助设备的访问”时,这些方法才有效。

        2
  •  1
  •   Boaz Stuller    17 年前

    一个可能对你更有效的简单方法是只让你的应用程序成为背景。关于电力系统共载的讨论 LSUIElement plist key解释了如何设置它。基本上,您的应用程序不会出现在dock或应用程序切换器中,并且在激活时不会替换当前应用程序的菜单栏。从用户的角度来看,它从来不是“活动”应用程序,但您打开的任何窗口都可以被激活并正常响应事件。唯一需要注意的是,您永远无法显示菜单栏,因此您可能需要设置NSStatusItem(菜单栏右侧显示的图标菜单之一)来控制应用程序(即退出、调出prefs等)。

    编辑:我完全忘记了Interface Builder中的非激活面板复选框。您需要使用NSPanel而不是NSWindow来获得此选择。此设置允许面板接受点击和键盘输入,而无需激活应用程序。我敢打赌,QuickSilver在用户界面上使用的是这种设置和Carbon热键API的某种混合。

        3
  •  0
  •   Mecki    17 年前

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

    现在,如果启用了根设备或辅助设备,无论您计划在哪个级别捕获,也不管您选择了捕获(允许您修改甚至丢弃事件)还是仅侦听,您都只能捕获按键事件设置事件点击。当标志发生更改(实际上甚至更改了这些标志)和其他事件时,您仍然可以获取信息,但在其他情况下都不能按下键。

    但是,使用carbon事件处理程序和RegisterEventHotKey()方法可以注册热键,按下热键时会收到通知,您不需要成为该热键的root用户,也不需要启用任何类似辅助设备的功能。我认为Quicksilver可能就是这样做的。