【问题标题】:How to intercept events from specific windows in OSX如何在 OSX 中拦截来自特定窗口的事件
【发布时间】:2014-12-16 20:51:21
【问题描述】:

我希望有以下工作流程:

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

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

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

【问题讨论】:

    标签: macos events nswindow nsevent cgeventtap


    【解决方案1】:

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

    使用kAXFocusedApplicationAttributekAXFocusedWindowAttribute 属性和valueOfAttribute:ofUIElement: 在您向应用“注册”时获取窗口/应用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多