【问题标题】:How to get the list of open windows from xserver如何从 xserver 获取打开的窗口列表
【发布时间】:2010-09-20 03:43:48
【问题描述】:

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

【问题讨论】:

    标签: x11 xserver


    【解决方案1】:

    您可以在 CLI 中使用

    xwininfo -tree -root
    

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

    【讨论】:

    • 如果可以的话,我会修改两次!
    • 这对于列出窗口非常有用。我现在想知道是否有一个命令会强制关闭特定窗口
    【解决方案2】:

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

    xprop -root|grep ^_NET_CLIENT_LIST
    

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

    【讨论】:

    • 我喜欢这个;它始终比 xwininfo 或 xdotool 快(尽管 xdotool 可以轻松排除可见窗口)。
    【解决方案3】:

    基于Marten's answer,(假设您的窗口管理器支持E扩展Window Manager Hints) 您可以将该窗口 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))
    

    【讨论】:

    • 我喜欢 EWMH 模块的易用性,但是我将 window_manager_manager 对象名称缩写为 wm。此外,我在 xlib 示例行 property_type=AnyPropertyType 上收到一个错误,该错误为:TypeError: get_full_property() got an unexpected keyword argument 'property_type'
    • @WinEunuuchs2Unix 为什么我现在这么称呼它,这让我很困惑,哈哈。你得到这个错误很奇怪。我刚拿出我的 Linux 笔记本电脑来测试脚本,它运行对我来说没有问题,但也许我们使用的是不同版本的 python-xlib?在任何情况下,如果您只是删除 property_type= 部分,它应该可以用作位置参数。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多