我正在 QT 中编写一个库,它将截取任意外部窗口的屏幕截图。我知道如何使用截图QScreen::grabWindow()
,但这需要作为参数WId
,我想知道是否有办法获得列表WId
s 表示屏幕和/或桌面上的所有窗口(或类似的东西,例如获取WId
对于使用标题名称的特定窗口),通过 QT。我知道我可以通过依赖于平台的方式来做到这一点,例如EnumWindows
在 Windows 中,但如果可能的话,我希望在 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)