4

ドラッグ開始時よりもはるかに遅れて通知を送信するkAXWindowMovedNotification(アクセシビリティAPI-AXObserver経由でリッスン)の代わりに、継続的な更新を取得するために利用できる他の方法はありますか?可能であれば、継続的な更新が必要です。

または、(別のアプリで)ウィンドウの動きを検出するための代替方法はありますか?実際、必要なのはドラッグの正確な開始時間と終了時間だけです。その間、私は本当に気にしません。kAXWindowMovedNotificationは、開始時刻が遅すぎることを報告します。

4

1 に答える 1

6

これは、アクセシビリティ API を使用して実際に行うことはできません。ウィンドウの移動が終了した後にAXWIndowMovedのみ通知を送信します。

さらに、ウィンドウのポーリングも機能しkAXPositionAttributeません。ドラッグ中は、ウィンドウの移動が完了するまで、ウィンドウは以前の位置を報告します。

CGWindowListCopyWindowInfoただし、ドラッグ中にウィンドウの位置を返します。残念ながら、これに関連付けられた通知メカニズムはないため、この関数を定期的に呼び出して変更を検出する必要があります。この方法でのポーリングは、明らかに、通知を受け取るよりもはるかに多くの CPU を集中的に使用します。

ポーリングを削減できる方法の 1 つは、 を使用してマウス イベントをリッスンすることCGEventTapCreateです。イベント フィールドをチェックしkCGMouseEventWindowUnderMousePointerThatCanHandleThisEventて、マウス ダウン イベントの対象となっているウィンドウを見つけ、マウス移動イベントでそのウィンドウの位置をポーリングできる場合があります。変化を検出すると、ドラッグが開始され、マウス アップ イベントで終了します。

もちろん、これは他のアクション (たとえば、ズーム ボタンを押す、ウィンドウがプログラムによって移動される) によって引き起こされたウィンドウの位置の変化を検出するためには機能しません。また、マウスが動き始めるまでドラッグを検出できないため、ユーザーが移動する前にマウス ボタンをしばらく押したままにすると、ドラッグの検出が遅くなります。

完全を期すために、特定のアプリケーションをターゲットにしている場合は、mach_injectを使用してウィンドウの動きを検出できます。対象となるアプリケーションがクラッシュする可能性があり、デバッガーをアタッチできない iTunes や DVD プレーヤーなどのアプリケーションで動作しない可能性があるため、これを行うコードを出荷しないでください。

これを行うには、ターゲット アプリにNSWindowWillMoveNotificationandを登録する関数を挿入NSWindowDidMoveNotificationし、おそらく分散通知を使用してそれらをアプリに送り返します。

選択はあなた次第です。幸運を。

于 2013-03-22T21:36:19.020 に答える