gpt4 book ai didi

c++ - 在 QT 中获取窗口 WIds 列表

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:17 25 4
gpt4 key购买 nike

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

最佳答案

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

要使该平台独立,您必须编写一个(公共(public))函数,在其中使用预处理器 #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
}

关于c++ - 在 QT 中获取窗口 WIds 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com