我想有以下工作流程:
- 用户按热键或状态栏菜单按钮
- 用户单击窗口
- 窗口现已在我的应用程序中"注册"
- 应用拦截来自所有已注册窗口的鼠标事件
我读了很多关于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;
将 kAXFocusedApplicationAttribute
或 kAXFocusedWindowAttribute
属性与 valueOfAttribute:ofUIElement:
结合使用,以便在将窗口/应用"注册"到应用时获取窗口/应用。
当CGEvent
进来时,将当前聚焦的窗口/应用与已注册的窗口/应用列表进行比较,以确定是否应截获该事件。