2

我想要以下工作流程:

  • 用户按下热键或状态栏菜单按钮
  • 用户点击一个窗口
  • 窗口现在在我的应用程序中“注册”
  • 应用拦截所有注册窗口的鼠标事件

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

我怎样才能实现所需的功能?

4

1 回答 1

0

您可以使用 Mac OS X Accessibility 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;

当您将窗口/应用程序“注册”到您的应用程序时,请使用kAXFocusedApplicationAttributeorkAXFocusedWindowAttribute属性valueOfAttribute:ofUIElement:来获取窗口/应用程序。

当 aCGEvent出现时,将当前聚焦的窗口/应用程序与您注册的窗口/应用程序列表进行比较,以确定是否应该拦截该事件。

于 2015-02-05T22:45:43.637 回答