在QT中获取窗口WID的列表

Getting a list of window WIds in QT

本文关键字:WID 列表 窗口 获取 QT      更新时间:2023-10-16

我正在QT中编写一个库,它将截屏任意外部窗口。我知道如何使用QScreen::grabWindow()截屏,但这以WId为参数,我想知道是否有办法通过QT获得屏幕和/或桌面上所有窗口的WId列表(或类似的东西,例如使用标题名称获得特定窗口的WId)。我知道我可以用一种依赖于平台的方式来做到这一点,比如Windows中的EnumWindows,但如果可能的话,我希望在QT中保持跨平台。

这在Qt中是不可能的。如果你希望你的库是独立于平台的,你需要为你想要支持的每个平台编写一个代码。

为了使这个平台独立,您必须编写一个(公共)函数,在该函数中使用预处理器#if:测试平台

#ifdef __unix__
    // call unix specific code
#elseif ...
    // other platforms
#else
#error Platform not supported!
#endif

对于特定于unix的代码,您需要使用xlib,它在树中管理窗口。从下面的代码中,你会得到所有的窗口,在X11中有很多不可见的窗口,你不认为它们是单独的窗口。所以你肯定要过滤结果,但这取决于你想要的窗口类型。

以这个代码为起点:

#include <X11/Xlib.h>
// Window is a type in Xlib.h
QList<Window> listXWindowsRecursive(Display *disp, Window w)
{
    Window root;
    Window parent;
    Window *children;
    unsigned int childrenCount;
    QList<Window> windows;
    if(XQueryTree(disp, w, &root, &parent, &children, &childrenCount))
    {
        for(unsigned int i = 0; i < childrenCount; ++i)
        {
            windows << children[i];
            windows << listXWindowsRecursive(disp, children[i]);
        }
        XFree(children);
    }
    return windows;
}
Display *disp = XOpenDisplay(":0.0");
Window rootWin = XDefaultRootWindow(disp);
QList<Window> windows = listXWindowsRecursive(disp, rootWin);
foreach(Window win, windows)
{
    // Enumerate through all windows
}