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

时间:2014-12-16 20:51:21

标签: macos events nswindow nsevent cgeventtap

我想拥有以下工作流程:

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

我在CGEvents,CGEventTaps和NSEvents上阅读了很多内容。我可以使用CGEvents和CGEventTaps拦截全局事件并发布新事件,但是在NSEvent中没有像windowNumber这样的窗口信息,只有PSD(我不知道如何使用它们),所以我无法过滤非事件注册的窗户。另一方面,NSEvent不允许我通过localMonitor拦截全局事件,只拦截本地事件。

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

1 个答案:

答案 0 :(得分:0)

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

UIElementInspector Apple Sample Code给出了很多例子。

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

使用kAXFocusedApplicationAttribute kAXFocusedWindowAttribute属性与valueOfAttribute:ofUIElement:一起使用,以便在您的应用“注册”时获取窗口/应用。

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