2013-03-08 61 views
1

是否有任何其他方法可用于获取连续更新而不是kAXWindowMovedNotification(通过AXObserver进行监听的可访问性api),它比通过拖动开始后发送通知晚得多?如果可能,我需要不断更新。AXWindowMoved(通过AXObserver) - 持续更新?

或者还有其他的方法来检测窗口移动(在另一个应用程序中)?其实我只需要拖动的准确开始和结束时间。在我之间我并不在乎。 kAXWindowMovedNotification报告开始时间太晚。

回答

2

这实际上不可能使用Accessibility API。 AXWIndowMoved只发送通知after the window has finished moving

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

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

您可能能够减少投票的一种方法是使用CGEventTapCreate监听鼠标事件。您可以检查kCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent事件字段以查找鼠标停止事件的目标窗口,然后轮询该窗口在鼠标移动事件上的位置。如果您检测到更改,则会开始拖动,并以鼠标悬停事件结束。

当然,这将无法检测到由其他操作(例如按下缩放按钮,窗口以编程方式移动)导致的窗口位置更改。它也无法检测到拖动,直到鼠标开始移动,所以如果用户在移动之前按住鼠标键一会儿,您将会迟到检测拖动。

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

为此,您需要在目标应用程序中注入一个函数,该函数在目标应用程序中注册NSWindowWillMoveNotificationNSWindowDidMoveNotification,然后使用分布式通知将它们发送回您的应用程序。

选择是你的,而你自己的。祝你好运。

+0

谢谢你的选择,我会彻底调查他们。 – Wesley 2013-03-23 13:01:11