これは、アクセシビリティ API を使用して実際に行うことはできません。ウィンドウの移動が終了した後にAXWIndowMoved
のみ通知を送信します。
さらに、ウィンドウのポーリングも機能しkAXPositionAttribute
ません。ドラッグ中は、ウィンドウの移動が完了するまで、ウィンドウは以前の位置を報告します。
CGWindowListCopyWindowInfo
ただし、ドラッグ中にウィンドウの位置を返します。残念ながら、これに関連付けられた通知メカニズムはないため、この関数を定期的に呼び出して変更を検出する必要があります。この方法でのポーリングは、明らかに、通知を受け取るよりもはるかに多くの CPU を集中的に使用します。
ポーリングを削減できる方法の 1 つは、 を使用してマウス イベントをリッスンすることCGEventTapCreate
です。イベント フィールドをチェックしkCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent
て、マウス ダウン イベントの対象となっているウィンドウを見つけ、マウス移動イベントでそのウィンドウの位置をポーリングできる場合があります。変化を検出すると、ドラッグが開始され、マウス アップ イベントで終了します。
もちろん、これは他のアクション (たとえば、ズーム ボタンを押す、ウィンドウがプログラムによって移動される) によって引き起こされたウィンドウの位置の変化を検出するためには機能しません。また、マウスが動き始めるまでドラッグを検出できないため、ユーザーが移動する前にマウス ボタンをしばらく押したままにすると、ドラッグの検出が遅くなります。
完全を期すために、特定のアプリケーションをターゲットにしている場合は、mach_injectを使用してウィンドウの動きを検出できます。対象となるアプリケーションがクラッシュする可能性があり、デバッガーをアタッチできない iTunes や DVD プレーヤーなどのアプリケーションで動作しない可能性があるため、これを行うコードを出荷しないでください。
これを行うには、ターゲット アプリにNSWindowWillMoveNotification
andを登録する関数を挿入NSWindowDidMoveNotification
し、おそらく分散通知を使用してそれらをアプリに送り返します。
選択はあなた次第です。幸運を。