X11サーバーでカーソルが上にあるトップウィンドウを取得するにはどうすればよいですか?
ウィンドウは「アクティブ」(選択されている、開いているなど) である必要はありません。ウィンドウの上にカーソルが浮かんでいる必要があります。
前もって感謝します。
XQueryPointer()
マウスの位置を取得するために使用できます。次に、 を使用してウィンドウ リストを取得しますXQueryTree()
。XQueryTree()
ウィンドウ リストを適切な z オーダーで返すので、バウンディング ボックスがポインターの下にあるウィンドウが見つかるまですべてのウィンドウをループするだけで、バウンディング ボックスを特定XGetWindowAttributes()
するために必要なすべての情報が得られます。ただし、成形窓で何をするかはわかりません。
私は数年間 X11 を扱っていないので、これはかなり不格好なアプローチかもしれませんが、うまくいくはずです。また、私はもう O'Reilly X11 の本を持っていません。低レベルの X11 を扱うつもりなら、そのシリーズの 1 本を手に入れたいと思うでしょう。最近はシリーズ全体がオンラインで無料で入手できると思います。
私は X11 を 10 年以上プログラミングしていないので、間違っていたらすみません。
Windowsでマウス移動イベントを登録できると思います。ウィンドウ ハンドルを変数などに格納してそのようなイベントを処理し、イベントを処理してツリーに浸透しないようにすると、ウィンドウを識別したいときに変数をクエリするだけで済みます。
ただし、これは適切なイベント ハンドラーを登録したウィンドウ上にマウスがある場合にのみ機能するため、他のアプリケーションに属するウィンドウについてはわかりません。他のユーザーのウィンドウでイベントを登録する方法がない限り、可能。
他の答えに対する利点は、ツリー全体をトラバースする必要がないことです。欠点は、非常に多くのマウス移動イベントを処理する必要があり、他の人のウィンドウを見つけることができない場合があることです。
必要な処理量を減らすために、マウスの入力イベントとマウスの離脱イベントもあると思います。