在QT中获取窗口WID的列表
Getting a list of window WIds in QT
我正在QT中编写一个库,它将截屏任意外部窗口。我知道如何使用QScreen::grabWindow()
截屏,但这以WId
为参数,我想知道是否有办法通过QT获得屏幕和/或桌面上所有窗口的WId
列表(或类似的东西,例如使用标题名称获得特定窗口的WId
)。我知道我可以用一种依赖于平台的方式来做到这一点,比如Windows中的EnumWindows
,但如果可能的话,我希望在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
}
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 在QT中获取窗口WID的列表