如何在 OSX 中拦截来自特定窗口的事件



我想有以下工作流程:

  • 用户按热键或状态栏菜单按钮
  • 用户单击窗口
  • 窗口现已在我的应用程序中"注册"
  • 应用拦截来自所有已注册窗口的鼠标事件

我读了很多关于CGEvents,CGEventTaps和NSEvents的文章。我可以拦截全局事件并使用CGEvents和CGEventTaps发布新事件,但是NSEvent中没有像windowNumber这样的窗口信息,只有PSD(我不确定如何使用它们),所以我无法过滤掉未注册窗口中的事件。另一方面,NSEvent 不允许我拦截全局事件,只允许通过本地监视器拦截本地事件。

如何实现所需的功能?

您可以使用 Mac OS X 辅助功能 API 获取有关当前焦点窗口或应用程序的详细信息。

UIElementInspector Apple 示例代码给出了许多示例。

// Given a uiElement and its attribute, return the value of an accessibility object's attribute.
+ (id)valueOfAttribute:(NSString *)attribute ofUIElement:(AXUIElementRef)element;

kAXFocusedApplicationAttributekAXFocusedWindowAttribute 属性与 valueOfAttribute:ofUIElement: 结合使用,以便在将窗口/应用"注册"到应用时获取窗口/应用。

CGEvent进来时,将当前聚焦的窗口/应用与已注册的窗口/应用列表进行比较,以确定是否应截获该事件。

相关内容

  • 没有找到相关文章

最新更新