2013-03-08 62 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