Macos 如何在OSX中拦截来自特定窗口的事件

Macos 如何在OSX中拦截来自特定窗口的事件,macos,events,nswindow,nsevent,cgeventtap,Macos,Events,Nswindow,Nsevent,Cgeventtap,我希望具有以下工作流: 用户按下热键或状态栏菜单按钮 用户单击窗口 窗口现在已在我的应用程序中“注册” 应用程序从所有注册的窗口截获鼠标事件 我读了很多关于CGEvents、CGEventTaps和NSEvents的文章。我可以使用CGEvents和CGEventTaps截获全局事件并发布新事件,但在NSEvent中没有windowNumber之类的窗口信息,只有PSD(我不知道如何使用这些),因此我无法从未注册的窗口中过滤出事件。另一方面,NSEvent不允许我截获全局事件,只允许通过lo

我希望具有以下工作流:

  • 用户按下热键或状态栏菜单按钮
  • 用户单击窗口
  • 窗口现在已在我的应用程序中“注册”
  • 应用程序从所有注册的窗口截获鼠标事件
我读了很多关于CGEvents、CGEventTaps和NSEvents的文章。我可以使用CGEvents和CGEventTaps截获全局事件并发布新事件,但在NSEvent中没有windowNumber之类的窗口信息,只有PSD(我不知道如何使用这些),因此我无法从未注册的窗口中过滤出事件。另一方面,NSEvent不允许我截获全局事件,只允许通过localMonitor截获本地事件


如何实现所需的功能?

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

本文给出了许多例子

// 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:ofielment:
在应用程序中“注册”窗口/应用程序时获取该窗口/应用程序

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