You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:27:03