C++ 如何使用X11获取当前光标位于其顶部的窗口?

C++ 如何使用X11获取当前光标位于其顶部的窗口?,c++,c,x11,xorg,xserver,C++,C,X11,Xorg,Xserver,如何在X11服务器中检索光标位于顶部的顶部窗口 窗口不必是“活动的”(选中的、打开的,等等),它只需要让光标浮动在它上面 提前感谢。您可以使用XQueryPointer()获取鼠标位置。然后使用XQueryTree()获取窗口列表XQueryTree()以正确的z顺序返回窗口列表,这样您就可以在所有窗口中循环,直到找到一个边界框在指针下,XGetWindowAttributes()将为您提供计算边界框所需的一切。我不确定你会怎么处理异形窗 我已经有几年没有使用X11了,所以这可能是一个相当笨拙的

如何在X11服务器中检索光标位于顶部的顶部窗口

窗口不必是“活动的”(选中的、打开的,等等),它只需要让光标浮动在它上面


提前感谢。

您可以使用
XQueryPointer()
获取鼠标位置。然后使用
XQueryTree()
获取窗口列表
XQueryTree()
以正确的z顺序返回窗口列表,这样您就可以在所有窗口中循环,直到找到一个边界框在指针下,
XGetWindowAttributes()
将为您提供计算边界框所需的一切。我不确定你会怎么处理异形窗


我已经有几年没有使用X11了,所以这可能是一个相当笨拙的方法,但它应该可以工作。我也没有我的O'Reilly X11的书了,如果你打算用低水平的X11材料工作,你会想得到那一系列的第一本书;我想现在整个系列都可以在网上免费下载。

我已经十多年没有为X11编程了,所以如果我弄错了,请原谅

我相信您可以在windows上注册鼠标移动事件。如果您通过将窗口句柄存储在某个变量或其他变量中来处理此类事件,然后处理该事件,使其不会渗透到树中,那么在您想要标识窗口时,您可以只查询该变量

但是,这仅在鼠标位于已为其注册合适事件处理程序的窗口上时才起作用,因此您不会知道属于其他应用程序的窗口,除非有可能在其他人的窗口上注册事件

与另一个答案相比,它的优点是不必遍历整棵树。缺点是您需要处理大量鼠标移动事件,并且可能无法找到其他人的窗口


我相信也可能有鼠标进入和鼠标离开事件,这将减少所需的处理量。

例如:我想到了奥雷利出版的阿德里安·奈伊的书(XLib编程手册,XLib参考手册),该系列是我X11/Motif时代的圣经。