49

任何人都知道如何从 Xserver 获取所有打开窗口的列表?

4

3 回答 3

112

在 CLI 中,您可以使用

xwininfo -tree -root

如果您需要在自己的代码中执行此操作,则需要使用库中的XQueryTree函数Xlib

于 2008-10-31T08:57:52.217 回答
19

如果您的窗口管理器实现了 EWMH 规范,您还可以查看_NET_CLIENT_LIST根窗口的值。这是由大多数现代窗口管理器设置的:

xprop -root|grep ^_NET_CLIENT_LIST

该值可以通过编程轻松获得,请参阅您的 Xlib 文档!

于 2009-06-19T13:22:05.520 回答
9

根据Marten 的回答,(假设您的窗口管理器支持扩展窗口管理器H ints )您可以将该窗口 ID 列表反馈回以获取该属性:xprop_NET_WM_NAME

$ xprop -root _NET_CLIENT_LIST |
    pcregrep -o1 '# (.*)' |
    sed 's/, /\n/g' |
    xargs -I{} -n1 xprop -id {} _NET_WM_NAME

但是在命令行中,它会更容易使用wmctrl

$ wmctrl -l

以编程方式python-xlib,您可以通过以下方式执行相同操作:

#!/usr/bin/env python
from Xlib.display import Display
from Xlib.X import AnyPropertyType

display = Display()
root = display.screen().root

_NET_CLIENT_LIST = display.get_atom('_NET_CLIENT_LIST')
_NET_WM_NAME = display.get_atom('_NET_WM_NAME')

client_list = root.get_full_property(
    _NET_CLIENT_LIST,
    property_type=AnyPropertyType,
).value

for window_id in client_list:
    window = display.create_resource_object('window', window_id)
    window_name = window.get_full_property(
        _NET_WM_NAME,
        property_type=AnyPropertyType,
    ).value
    print(window_name)

或者,更好的是,使用EWMH库:

#!/usr/bin/env python
from ewmh import EWMH

window_manager_manager = EWMH()
client_list = window_manager_manager.getClientList()

for window in client_list:
    print(window_manager_manager.getWmName(window))
于 2020-05-13T20:40:35.493 回答