在 QT 中获取窗口 WId 列表

JBe*_*ley 3 c++ qt screenshot

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

lee*_*mes 5

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

为了使这个平台独立,您必须编写一个(公共)函数,在其中使用 preprocessor 测试平台#if

#ifdef __unix__
    // call unix specific code
#elseif ...
    // other platforms
#else
#error Platform not supported!
#endif
Run Code Online (Sandbox Code Playgroud)

对于 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
}
Run Code Online (Sandbox Code Playgroud)