我正在写在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