【问题标题】:Get Window ID from xcb using a class or name使用类或名称从 xcb 获取窗口 ID
【发布时间】:2016-05-14 21:45:30
【问题描述】:

我想使用 Qt 的 QWindow::fromWinID 函数将小部件绘制到外部窗口上(希望这会起作用)。

不幸的是,我需要在具有特定名称/类的窗口上绘图(我可以使用 xwininfo 和 xprop 显示它)。我能找到的唯一代码是在 xwininfo 和 xprop 的源代码中,但它似乎是一堆不必要的代码来做一件简单的事情:找到某个属性等于某个字符串的窗口,并返回它的窗口 ID供 Qt 使用。不幸的是,我对 XCB 非常精通,不知道如何开始。

如果没有 200 行代码,我怎么能做到这一点?

【问题讨论】:

    标签: qt xcb


    【解决方案1】:

    我能找到的唯一代码是在 xwininfo 和 xprop 的源代码中

    这确实是一个很棒的资源,以及 xdotool。

    找到某个属性等于某个字符串的窗口

    是的,但是没有内置的 X11 可以做到这一点,这就是这些工具采用这种方式的原因。然后还有一些事情需要考虑,比如重父窗口管理器和非重父窗口管理器,即是否需要进入客户端窗口等等。

    恐怕没有更简单的方法了。低级 X 编程,无论是使用 Xlib 还是 XCB,都会带来一些冗长。

    您可以考虑使用从xdotool 提取(并由其使用)的库,称为libxdo。它会在xdo_search_windows 中为您提供此功能。不过,该库使用(并因此引入)Xlib 而不是 XCB。

    这是一个您可以使用gcc -lxdo test.c 编译的示例程序:

    #include <xdo.h>
    
    int main() {
        xdo_t *xdo = xdo_new(NULL);
        xdo_enter_text_window(xdo, CURRENTWINDOW, "A", 0);
        return 0;
    }
    

    【讨论】:

    • 感谢有关 libxdo 的提示。不过,我似乎无法与它链接(或者至少符号 nm 告诉我它定义在我与它链接后仍未定义......我的系统上确实有 /usr/lib/libxdo.so (链接器可以找到文件),但我仍然得到一个未定义的引用。知道为什么会这样吗?
    • @rubenvb 我已经用示例程序编辑了我的答案并编译了说明。这对我有用。
    • 看来我需要在 xdo.h 包含上添加 extern "C" ,否则我会得到未解析的符号。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多