Objective c AXWindowMoved(通过AXObserver)-持续更新?

Objective c AXWindowMoved(通过AXObserver)-持续更新?,objective-c,xcode,cocoa,nswindow,accessibility-api,Objective C,Xcode,Cocoa,Nswindow,Accessibility Api,有没有其他方法可以代替kAXWindowMovedNotification(可访问性api-通过AXObserver侦听)来获取持续更新,而kAXWindowMovedNotification只是在比开始拖动时晚得多的时间发送通知?如果可能的话,我需要持续更新 或者是否有其他方法检测窗口移动(在另一个应用程序中)?事实上,我只需要准确的开始和结束时间的阻力。介于两者之间,我真的不在乎。kAXWindowMovedNotification报告启动时间太迟 使用可访问性API实际上不可能做到这一点A

有没有其他方法可以代替kAXWindowMovedNotification(可访问性api-通过AXObserver侦听)来获取持续更新,而kAXWindowMovedNotification只是在比开始拖动时晚得多的时间发送通知?如果可能的话,我需要持续更新


或者是否有其他方法检测窗口移动(在另一个应用程序中)?事实上,我只需要准确的开始和结束时间的阻力。介于两者之间,我真的不在乎。kAXWindowMovedNotification报告启动时间太迟

使用可访问性API实际上不可能做到这一点<代码>AXWIndowMoved仅发送通知

此外,为其
kAXPositionAttribute
轮询窗口也不起作用。拖动时,窗口将报告其以前的位置,直到窗口完成移动

但是,在拖动过程中确实会返回窗口的位置。不幸的是,没有与此相关的通知机制,因此您必须定期调用此函数以检测任何更改。显然,以这种方式进行轮询比接收通知更占用CPU

减少轮询的一种方法是使用监听鼠标事件。您可以在MousePointCanHandletThisEvent事件字段下检查
KCgMouseEventWindow,找到鼠标按下事件的目标窗口,然后在鼠标移动事件上轮询该窗口的位置。如果检测到更改,则拖动开始,并在鼠标向上移动事件中结束

当然,这不适用于检测由其他操作(例如,按下缩放按钮,窗口以编程方式移动)引起的窗口位置更改。在鼠标开始移动之前,它也无法检测到拖动,因此,如果用户在移动之前按住鼠标按钮一段时间,您将延迟检测到拖动

为了完整性起见,如果您针对的是特定的应用程序,则可以使用检测窗口移动。您绝对不应该提供这样做的代码,因为这可能会导致目标应用程序崩溃,并且可能无法在iTunes和DVD Player等不允许附加调试器的应用程序上工作

要做到这一点,您需要在目标应用程序中插入一个注册
NSWindowWillMoveNotification
NSWindowDidMoveNotification
的函数,然后使用分布式通知将它们发送回您的应用程序


选择权在你,只有你自己。祝你好运。

谢谢你的选择,我会彻底调查的。