【问题标题】: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;
使用kAXFocusedApplicationAttribute 或kAXFocusedWindowAttribute 属性和valueOfAttribute:ofUIElement: 在您向应用“注册”时获取窗口/应用。
当CGEvent 出现时,将当前聚焦的窗口/应用程序与您注册的窗口/应用程序列表进行比较,以确定是否应该拦截事件。