如何在Windows系统下使用Qt获取窗口ID实现指定窗口录制
Windows平台Qt实现指定窗口录制的操作方案
你当前使用screen->grabWindow(0)时传入的参数0是整个桌面的窗口ID,只要将目标窗口的ID作为参数传入该方法,即可实现指定窗口的画面抓取。Windows平台需要借助系统原生API获取第三方GUI程序的窗口句柄,再转换为Qt可识别的WId类型即可完成适配。
实现步骤
1. 配置项目依赖
首先在.pro项目配置文件中添加Windows系统user32库的链接声明:
win32: LIBS += -lUser32
在需要调用窗口获取逻辑的cpp文件中引入Windows API头文件:
#ifdef Q_OS_WIN #include <windows.h> #endif
2. 获取目标窗口句柄
提供两种常用的获取方式,可根据业务场景选择:
- 方式1:按窗口标题精准查找
适合已知目标窗口标题的场景,直接调用FindWindowAPI即可:#ifdef Q_OS_WIN // 第一个参数为窗口类名,填NULL代表不限制类名,第二个参数为目标窗口的完整标题 HWND targetHwnd = FindWindowA(NULL, "记事本"); // 示例:查找标题为“记事本”的窗口 if (!targetHwnd) { qDebug() << "目标窗口未找到,请检查窗口是否已启动"; return; } #endif - 方式2:枚举所有系统窗口筛选
适合需要给用户展示所有已打开窗口列表、手动选择目标的场景,调用EnumWindowsAPI遍历所有顶层窗口,自行编写规则筛选匹配的目标窗口即可。
3. 抓取指定窗口画面
将获取到的HWND强制转换为Qt的WId类型,传入grabWindow方法即可:
#ifdef Q_OS_WIN WId windowId = reinterpret_cast<WId>(targetHwnd); // 复用你原有逻辑的screen对象 QPixmap pixmap = screen->grabWindow(windowId); // 后续将pixmap写入视频流的逻辑保持原有实现即可 #endif
注意事项
- 如果目标窗口处于最小化状态,需要先调用
ShowWindow(targetHwnd, SW_RESTORE)还原窗口才能正常抓取画面 - 高DPI缩放场景下,需要在程序启动时调用
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2),避免抓取的窗口画面出现缩放拉伸模糊的问题 - 被其他窗口完全遮挡的区域,部分应用可能会抓取到黑色占位,可提前调用
SetForegroundWindow(targetHwnd)将目标窗口临时置前 - 如果目标程序是管理员权限启动的,当前Qt程序也需要以管理员权限运行,才能正常获取窗口句柄并完成抓取
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

