QT截图非顶层窗口的画面(获取窗口句柄)

2023-05-16

我们知道QT里截图的代码很简单,很多例子都是截取桌面,或截取整个屏幕。
那如果要截取指定窗口的画面呢?即使该窗口不在桌面最顶层显示。我们也能截到它的图片吗?
当然可以,只要我们拿到该窗口的句柄就可以截图了。

下面就是获取窗口句柄的基本API。
获取Windows下所有窗口的句柄,窗口标题,窗口类型等:

#include <windows.h>
enum window_search_mode {
    INCLUDE_MINIMIZED,
    EXCLUDE_MINIMIZED
};
static bool check_window_valid(HWND window, enum window_search_mode mode)
{
    DWORD styles, ex_styles;
    RECT  rect;

    if (/*!IsWindowVisible(window) ||*/
        (mode == EXCLUDE_MINIMIZED && IsIconic(window)))
        return false;

    GetClientRect(window, &rect);
    styles    = (DWORD)GetWindowLongPtr(window, GWL_STYLE);
    ex_styles = (DWORD)GetWindowLongPtr(window, GWL_EXSTYLE);

    if (ex_styles & WS_EX_TOOLWINDOW)
        return false;
    if (styles & WS_CHILD)
        return false;
    if (mode == EXCLUDE_MINIMIZED && (rect.bottom == 0 || rect.right == 0))
        return false;

    return true;
}
static inline HWND next_window(HWND window, enum window_search_mode mode)
{
    while (true) {
        window = GetNextWindow(window, GW_HWNDNEXT);
        if (!window || check_window_valid(window, mode))
            break;
    }

    return window;
}
static inline HWND first_window(enum window_search_mode mode)
{
    HWND window = GetWindow(GetDesktopWindow(), GW_CHILD);
    if (!check_window_valid(window, mode))
        window = next_window(window, mode);
    return window;
}

/

QString get_window_title(HWND hwnd)
{
    QString retStr;
    wchar_t *temp;
    int len;

    len = GetWindowTextLengthW(hwnd);
    if (!len)
        return retStr;

    temp = (wchar_t *)malloc(sizeof(wchar_t) * (len+1));
    if (GetWindowTextW(hwnd, temp, len+1))
    {
        retStr = QString::fromWCharArray(temp);
    }
    free(temp);
    return retStr;
}

QString get_window_class(HWND hwnd)
{
    QString retStr;
    wchar_t temp[256];

    temp[0] = 0;
    if (GetClassNameW(hwnd, temp, sizeof(temp) / sizeof(wchar_t)))
    {
        retStr = QString::fromWCharArray(temp);
    }
    return retStr;
}

有了以上几个API,我们就可以获取所以窗口的句柄了, INCLUDE_MINIMIZED 表示包含最小化的程序

HWND pWnd;
pWnd = first_window(INCLUDE_MINIMIZED); //得到第一个窗口句柄
pWnd = next_window(pWnd,INCLUDE_MINIMIZED);//得到下一个窗口句柄

可通过 get_window_title 函数获取该窗口是否是你想要截取的。
下面就是截图了,如果 pWnd 为0,表明截取的是全屏幕的图:

QScreen *screen = QGuiApplication::primaryScreen();
QPixmap map = screen->grabWindow((WId)pWnd);
map.save(QString(OBS_SCREEN_PATH),"JPG");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT截图非顶层窗口的画面(获取窗口句柄) 的相关文章

  • error Failed connect to github.com 443原因 Github更换认证方式

    Github更换认证方式 github近期调整了认证方式 xff0c 不再允许第三方工具基于账号密码来访问和管理项目了 除非使用github DeskTop 自带的客户端 好坑啊 我一直再用android studio 自带的提交工具很方便
  • AppCompatRatingBar备份用 下次拷贝直接用自定义图片背景

    控件 lt androidx appcompat widget AppCompatRatingBar android id 61 34 64 43 id rating bar 34 style 61 34 64 style myRating
  • 备份Edittext编辑框字数限制ui以及逻辑

    ui布局 etContent addTextChangedListener new TextWatcher 记录输入的字数 private CharSequence enterWords private int selectionStart
  • android—性能优化2—内存优化

    文章目录 性能优化 工具 memory profilerLeakCanaryarthookepic 库 java内存管理机制java 内存回收机制Android内存管理机制Dalvik与 Art区别Low Memory Killer 内存抖
  • glide4.11.0封装gfilib优化gif图片加载

    文章目录 具体步骤 下载giflib 和 framesequence导入并集成 giflib 和 framesequenceglide的配置gif使用giflib集成开始使用加载思路创建自定义GifDrawable 需求 目前项目中加载进度
  • java筑基.泛型,反射,注解-利用注解加反射练习

    文章目录 泛型 泛型类泛型方法泛型接口子类明确泛型类的类型参数变量子类不明确泛型类的类型参数变量 限定类型变量通配符泛型 注解元注解注解的应用场景 反射 注解 43 反射练习 泛型 把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特
  • android性能优化实践与总结(包含启动,内存优化)

    应用中性能优化实践与总结 精心总结 任何优化都需要进行检测 以数据说话 优化前和优化后有了怎样的提升 TOC 启动优化 检测启动时间 检测工具任选其一 hugo 插件 自己定义时间开始和结束手动计算时间 AOP 工具 AspectJ adb
  • android—性能优化3—网络优化

    文章目录 网络优化正确的认识流量消耗网络优化维度其他网络请求误区 网络优化工具选择Network Proifiler抓包工具stetho流量优化如何判断APP流量消耗偏高如何测试 测试方案 线上线下流量获取线上流量获取方案NetworkSt
  • java 实现死锁

    资源抢占 导致死锁 public static void main String args final Object a 61 new Object final Object b 61 new Object Thread threadA 6
  • cameraX视频录制 拷贝直接用

    文章目录 效果图activity代码项目地址 最下面是GIT 地址 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 3i0EaImv 1637722081187 https liudao01 github io
  • android studio maven 拉取代码出现 bad gateway 502

    一般都是gradle 配置的maven的仓库 问题 我这里是因为使用了 repositories google jcenter mavenCentral 新增 maven url 39 https www jitpack io 39 mav
  • android studio使用 maven push 插件上传私有maven - 已成功使用到项目中

    gradle 任务 下面是放在gradle 配置里面 比如 我的项目model 是 apm 那么 就把下面的代码放到 apm的 gradle 下面 plugins id 39 com android library 39 id 39 kot
  • 工作的三个层次,什么样的工作堪称自由

    工作的三个层次 xff0c 什么样的工作堪称自由 先说结论 只有工作的技艺人才是自由的 前段时间经常喜欢看建造类的视频 一个澳洲小哥 只用最原始的器械徒手打造东西 比如空手打造石斧 空手打造钻木取火套装等等 这类视频很有意思 我就特别爱看
  • android 创建Model 解决无法依赖传递问题 , 实现 sdk 依赖关系的传递

    介绍 我现在创建了一个应用A 一个库工程 B B 远程依赖了库工程C A远程依赖B工程 B 是通过Maven 发布成远程依赖库 B 作为一个通用的库工程 发布到了Maven上 就可以比较简单的被各个项目引入 如下图 问题 目前存在一个问题
  • 2021总结. 2022展望

    2021 收获了许多 技能上 学习了多个技能 自由泳自由倒立复刻拳王梅威瑟的跳绳训练单板滑雪 总结 技能上尽量是身体力行的 自从看过 囚徒健身 后 被作者的自传所影响 希望成为想他那样的人 认知上 认知上也有了提升 读了许多书 今年比较喜欢
  • 仿照爱时间app写的时钟 自定义view

    MyClockView MyClockView 仿照 爱时间app 写的自定义时间控件 爱时间的 控件 我写的控件 可以看到我写的在指针 刻度上面 是比他要精细一些的 后面的点击事件 还有中间文字的绘制 都是一些套路 我的时间也不够多 就不
  • dagger2简单使用与理解笔记

    文章目录 使用dagger2好处具体案例查看github 1 使用dagger2注入基本使用流程概念 2 dagger2中各种注解基本使用引入dagger20 写两个对象 用来实际操作的1 写module类 注解Module Provide
  • electron调用dll文件

    Electron 对系统层能力的使用可能比较弱 xff0c 此时需要求助 Python C 43 43 C 等语言 xff0c 通过 ffi napi 库可以让 Node js 使用 C 43 43 dll xff0c 通过 electro
  • 动态库和静态库的区别

    什么是库文件 一般来说 一个程序 通常都会包含目标文件和若干个库文件 经过汇编得到的目标文件再经过和库文件的链接 就能构成可执行文件 库文件像是一个代码仓库或代码组件的集合 为目标文件提供可直接使用的变量 函数 类等 库文件包含了静态链接库
  • reactor/proactor模型简介

    Reactor和preactor都是IO多路复用模式 xff0c 一般地 I O多路复用机制都依赖于一个事件多路分离器 Event Demultiplexer 分离器对象可将来自事件源的I O事件分离出来 xff0c 并分发到对应的read

随机推荐

  • c语言中的带参宏定义

    C语言允许宏带有参数 在宏定义中的参数称为形式参数 xff0c 在宏调用中的参数称为实际参数 xff0c 这点和函数有些类似 对带参数的宏 xff0c 宏展开和用实参替代形参 xff0c 发生在预处理阶段 示例1 xff1a define
  • ZCU102 Zynq MPSoC IP设置与说明

    目录 1 前言2 设置与说明2 1 PS UltraScale 43 Block Design2 2 I O Configuration2 2 1 Bank0 3电压 xff1a 2 2 2 Low SpeedQSPISD卡CANI2CPM
  • ROS下使用激光雷达RPLIDAR-A2进行SLAM完成地图的构建

    想要进行一个完整的地图建立离不开以下几个模块 xff1a 1 坐标 2 激光数据 3 绘图算法 ROS工程可以从我的GitHub上面下载 xff1a https github com LJianlin ROS SLAM Gmapping 下
  • C 语言Socket 实现http 带参数的POST请求

    本文叙述C语言中结合socket 如何实现http POST请求 xff0c 对于http协议相关内容可以查看HTTP协议详解 对于不带参数的post请求 xff0c 只需要按照http格式发送即可 下面以带参数的POST请求为例 1 C
  • 【学习C++】1.开始学习C++

    从今天开始学习C 43 43 xff0c 争取一年之内把 C 43 43 Primer Plus 看上两遍 xff0c 平均一周看一章 xff0c 并做课后对应习题 今天把 C 43 43 Primer Plus 的第二章看完了 xff0c
  • Ubuntu下安装make

    方法一 xff1a xff08 自动安装 xff09 1 进入root权限 xff1a su root 2 更新安装列表 xff1a apt get update 3 安装make xff1a apt get install ubuntu
  • nginx源码分析之http解码实现

    分析nginx是如何解析并且存储http请求的 对非法甚至恶意请求的识别能力和处理方式 可以发现nginx采用状态机来解析http协议 xff0c 有一定容错能力 xff0c 但并不全面 相关配置 跟解码有关的配置 merge slashe
  • 经纬高坐标系-ECEF坐标系-ENU坐标系

    无人机搭载的RTK获得的经纬高坐标要转换为东北天坐标 xff0c 才能用于局部的导航和定位 为了这个目的 xff0c 查阅资料 xff0c 越查越懵逼 xff0c 竟然这么多的坐标系 xff0c 略懂之后 xff0c 将学到的信息记录如下
  • Docker基础操作

    安装curl时报错 curl Depends libcurl3 gnutls 61 7 47 0 1ubuntu2 12 but 7 58 0 2ubuntu3 6 is to be installed sudo apt get purge
  • 1. COM是一个更好的C++

    看COM本质论做的总结 1 1 软件分发和C 43 43 class FastString span class token punctuation span span class token keyword char span span
  • 2.COM接口

    2 1 再谈接口与实现 其实从上一章 COM是个更好的C 43 43 可以看出 xff0c COM最重要的就是将接口与实现分离 上一章中接口定义头文件中采用C 43 43 抽象类的形式 xff0c 如果调用方是C 43 43 环境当然不会有
  • [QT]QMessageBox 的四种用法

    之前的一些QT笔记 xff0c 整理一下 void MainWindow on info clicked info QMessageBox information this 34 Title 34 34 Text 34 void MainW
  • svn执行update,却被告知database is locked

    svn执行update xff0c 却被告知database is locked xff01 执行 svn update xff0c 却抛出个错误警报 xff1a svn E200033 database is locked executi
  • ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)

    源码下载地址 http download csdn net detail liukang325 9489952 我用的ffmpeg版本为 ffmpeg 2 1 8 tar bz2 版本低了恐怕有些头文件和API找不到 在Linux下解压后编
  • PCM音频文件格式的头信息

    一个裸的PCM格式音频数据 xff0c 如果不带头信息 xff0c 不知道其采样率等相关信息 xff0c 就无法用播放器播放出来 下面是默认的头信息格式 xff1a span class hljs comment 音频头部格式 span s
  • 解决cc1plus.exe: error: out of memory allocating

    QT中增加资源文件过大时 xff0c 会编译不过 xff0c 报错 xff1a span class hljs attribute cc1plus exe span span class hljs string out of memory
  • 单片机 APROM: RAM: Flash:区别

    APROM是用户程序存储区 xff0c 我们写的单片机的程序的代码 xff0c 就放在这里 APROM是 xff0c APROM是Flash中的一部分 RAM xff0c 随机存储器 xff0c 主要用来存放动态数据 xff0c 比如我们程
  • 改变全局变量值得两种方法

    方法一 xff1a 指针法 include lt iostream gt using namespace std void change int a void main int t change amp t 注意这里是传入变量的地址 xff
  • QT中为程序加入超级管理员权限

    QT的一些文件操作 xff0c 注册表的操作等 xff0c 有些操作会无效 xff0c 主要是因为没有对C盘的相关权限 解决方法 xff1a 1 mingw编译器 在pro工程文件中加入 span class hljs attribute
  • QT截图非顶层窗口的画面(获取窗口句柄)

    我们知道QT里截图的代码很简单 xff0c 很多例子都是截取桌面 xff0c 或截取整个屏幕 那如果要截取指定窗口的画面呢 xff1f 即使该窗口不在桌面最顶层显示 我们也能截到它的图片吗 xff1f 当然可以 xff0c 只要我们拿到该窗