是否有任何其他方法可用于获取连续更新而不是kAXWindowMovedNotification(通过AXObserver进行监听的可访问性api),它比通过拖动开始后发送通知晚得多?如果可能,我需要不断更新。AXWindowMoved(通过AXObserver) - 持续更新?
或者还有其他的方法来检测窗口移动(在另一个应用程序中)?其实我只需要拖动的准确开始和结束时间。在我之间我并不在乎。 kAXWindowMovedNotification报告开始时间太晚。
是否有任何其他方法可用于获取连续更新而不是kAXWindowMovedNotification(通过AXObserver进行监听的可访问性api),它比通过拖动开始后发送通知晚得多?如果可能,我需要不断更新。AXWindowMoved(通过AXObserver) - 持续更新?
或者还有其他的方法来检测窗口移动(在另一个应用程序中)?其实我只需要拖动的准确开始和结束时间。在我之间我并不在乎。 kAXWindowMovedNotification报告开始时间太晚。
这实际上不可能使用Accessibility API。 AXWIndowMoved
只发送通知after the window has finished moving。
另外,轮询窗口的kAXPositionAttribute
也不起作用。被拖动时,窗口将报告其之前的位置,直到窗口移动完成。
CGWindowListCopyWindowInfo
然而,确实在拖动过程中返回窗口的位置。不幸的是,没有与此相关的通知机制,因此您必须定期调用此函数来检测任何更改。显然,以这种方式进行轮询比接收通知要花费更多的CPU资源。
您可能能够减少投票的一种方法是使用CGEventTapCreate
监听鼠标事件。您可以检查kCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent
事件字段以查找鼠标停止事件的目标窗口,然后轮询该窗口在鼠标移动事件上的位置。如果您检测到更改,则会开始拖动,并以鼠标悬停事件结束。
当然,这将无法检测到由其他操作(例如按下缩放按钮,窗口以编程方式移动)导致的窗口位置更改。它也无法检测到拖动,直到鼠标开始移动,所以如果用户在移动之前按住鼠标键一会儿,您将会迟到检测拖动。
为了完整起见,如果您针对特定应用程序,则可以使用mach_inject来检测窗口移动。您绝对不应该提供这样做的代码,因为它可能会导致目标应用程序崩溃,并且可能无法在iTunes和DVD播放器等应用程序上运行,这些应用程序不允许您附加调试器。
为此,您需要在目标应用程序中注入一个函数,该函数在目标应用程序中注册NSWindowWillMoveNotification
和NSWindowDidMoveNotification
,然后使用分布式通知将它们发送回您的应用程序。
选择是你的,而你自己的。祝你好运。
谢谢你的选择,我会彻底调查他们。 – Wesley 2013-03-23 13:01:11