2013-03-08 4 views
1

Есть ли какой-либо другой способ получения непрерывных обновлений вместо kAXWindowMovedNotification (доступность api - прослушивается через AXObserver), который просто отправляет уведомление намного позже, чем при перетаскивании? Мне нужно постоянно обновлять, если это вообще возможно.AXWindowMoved (через AXObserver) - непрерывные обновления?

Или есть альтернативные способы обнаружения движения окна (в другом приложении)? На самом деле мне нужно только точное время начала и окончания перетаскивания. Между ними мне все равно. kAXWindowMovedNotification сообщает о времени начала слишком поздно.

ответ

2

Это невозможно сделать с помощью API Accessibility. AXWIndowMoved только отправляет уведомление after the window has finished moving.

Кроме того, опрос окна для его kAXPositionAttribute также не будет работать. При перетаскивании окно сообщит о своей предыдущей позиции, пока окно не закончит движение.

CGWindowListCopyWindowInfo, однако, возвращает положение окон во время перетаскивания. К сожалению, нет механизма уведомления, связанного с этим, поэтому вам придется вызывать эту функцию через определенные промежутки времени, чтобы обнаружить какие-либо изменения. Опрос таким образом, очевидно, намного интенсивнее, чем получение уведомления.

Один из способов, с помощью которого вы можете опробовать опрос, - это прослушивание событий мыши с использованием CGEventTapCreate. Вы можете проверить поле событий kCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent, чтобы найти окно, предназначенное для события мыши, и затем опросить позицию этого окна при перемещении мыши. Если вы обнаружите изменение, у вас есть начало вашего перетаскивания, и оно заканчивается событием мыши.

Конечно, это не сработает, чтобы обнаружить изменения положения окна, вызванные другими действиями (например, нажатием кнопки масштабирования, при этом окно будет перемещаться программно). Он также не может обнаружить перетаскивание до тех пор, пока мышь не начнет двигаться, поэтому, если пользователь удерживает кнопку мыши на некоторое время перед перемещением, вы обнаружите, что перетащить поздно.

Для полноты, если вы ориентируетесь на конкретное приложение, можно обнаружить движение окна с помощью mach_inject. Вы определенно не должны отправлять код, который делает это, так как это может привести к сбою целевого приложения и может не работать с такими приложениями, как iTunes и DVD Player, которые не позволяют подключать отладчик.

Для этого вы должны ввести функцию, которая регистрируется для NSWindowWillMoveNotification и NSWindowDidMoveNotification в целевом приложении, а затем отправить их обратно в приложение, возможно, используя распределенные уведомления.

Выбор за вами, и ваш только один. Удачи.

+0

Благодарим вас за варианты, я тщательно их изучу. – Wesley

 Смежные вопросы

  • Нет связанных вопросов^_^