获得在QT窗口WIDS列表(Getting a list of window WIds in QT)

2019-06-26 11:29发布

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

Answer 1:

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

为了使这个独立的平台,你必须写在你测试使用的预处理器的平台(公共)功能#if

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

对于UNIX特定的代码,你需要使用的Xlib,负责管理窗口中的一棵树。 从下面的代码,你会得到所有的窗口,并在X11有很多看不见的Windows和Windows,你不认为它们是独立的窗口。 所以,你一定要过滤结果,但是这取决于你想有哪个窗口类型。

把这个代码作为开始:

#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
}


文章来源: Getting a list of window WIds in QT