我想在屏幕上打印有关 Linux 下顶级窗口的信息。
我使用 xlib 函数。我成功地从根窗口递归打印所有显示的元素的所有信息。
但我只需要顶级窗口。我没有找到任何过滤的好方法。
来自维基百科:
顶层窗口正是根窗口的直接子窗口。
有了这个定义,我的列表上有一些窗口,例如:gnome-session、seahorse-daemon、notify-osd 或图标,我不想要它们。
我还找到了一个函数:XmuClientWindow,但我不明白它的目标。
让我们看看我是否正确理解你想要什么。顶级窗口是根窗口的直接子窗口,或者是虚拟根窗口的一些窗口管理器 - 请参阅Root Window (Wikipedia),您似乎已经找到了。那篇文章还告诉你如何找到虚拟根窗口的列表。您可以在根或虚拟根上使用 XQueryTree 来查找子窗口列表。
一旦你有了那个列表,你可能需要应用许多讨厌的启发式方法来找到你感兴趣的窗口。XmuClientWindow 将告诉您哪个应用程序窗口(如果有)与您的顶级窗口相关联。应用程序创建窗口,并且窗口管理器将它们重新定义为顶级窗口的子级,它们创建该窗口以保存窗口装饰和事物(最大化按钮、关闭按钮、调整句柄大小)。阅读扩展窗口管理器提示从客户端/应用程序窗口可以告诉您诸如您是否正在处理特殊窗口(停靠、面板等)之类的事情。您可能还想查看应用程序窗口上的窗口管理器提示(XGetWMHints(3)、XGetWMNormalHints(3)、XGetWMSizeHints(3))来决定您是否感兴趣 - 窗口管理器会创建很多您需要的临时窗口可能不在乎。
请参阅 VirtualBox Guest Additions 中的无缝代码,以获取查看顶层窗口的示例。
wmctrl -l
这个简单的命令将列出根目录下的所有顶级窗口。