Qt/C++ 获取QProcess启动的第三方软件的窗体标题
Qt/C++ 获取QProcess启动的第三方软件的窗体标题,在使用EnumWindows获取窗体句柄(HWND)时,如果返回提前FALSE,则获取到的HWND状态IsWindow正常,但就是获取不到窗体标题。必须正常返回TRUE才能使用HWND获取到窗体标题,要不然获取到的标题内容就是空。
QProcess线程需要在启动后等待几秒的时间再获取打开的窗体句柄,或者一直While(true)获取窗体句柄直到获取HWND不为空为止。
目录
- 使用EnumWindows获取所有窗体句柄和PID
- 写法1
- 写法2
- 获取窗体标题
- 使用 GetWindowTextA 获取窗体标题
- 使用 SendMessage获取窗体标题
- 使用 DefWindowProcA获取窗体标题
- 使用 GetClassNameA获取窗体类名称
- 使用FindWindowEx获取窗体句柄
使用EnumWindows获取所有窗体句柄和PID
写法1
static HWND GHO_HWMD_C=nullptr;
static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必须返回true 如果返回false 会造成HWND不能获取窗体标题,修改窗体隐藏等属性return TRUE;
}static BOOL CALLBACK EnumThreadChildProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必须返回true 如果返回false 会造成HWND不能获取窗体标题,修改窗体隐藏等属性return TRUE;
}static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必须返回true 如果返回false 会造成HWND不能获取窗体标题,修改窗体隐藏等属性return TRUE;EnumChildWindows(hwnd, EnumChildProc, lParam);EnumThreadWindows(processId,EnumThreadChildProc, lParam);
}//在所有线程中查找pid
//process.processId(); QProcess类processId()返回pid
EnumWindows(EnumWindowsProc, (LPARAM)process.processId());
写法2
EnumWindows([](HWND hwndparent, LPARAM lParam)->BOOL{DWORD processId = 0;GetWindowThreadProcessId(hwndparent, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}EnumChildWindows(hwndparent,[](HWND Chwnd, LPARAM lParam)->BOOL{DWORD CprocessId = 0;GetWindowThreadProcessId(Chwnd, &CprocessId);if (CprocessId == (DWORD)lParam){GHO_HWMD_C=hwnd;}return TRUE; // 返回TRUE以继续枚举下一个窗体},lParam);EnumThreadWindows(processId,[](HWND Thwnd, LPARAM lParam)->BOOL{DWORD TprocessId = 0;GetWindowThreadProcessId(Thwnd, &TprocessId);if (TprocessId == (DWORD)lParam){GHO_HWMD_C=hwnd;}return TRUE; // 返回TRUE以继续枚举下一个窗体},lParam);return TRUE; // 返回TRUE以继续枚举下一个窗体},(LPARAM)process.processId());
获取窗体标题
使用 GetWindowTextA 获取窗体标题
char WindowText[256];
GetWindowTextA(GHO_HWMD_C, WindowText, sizeof(WindowText));
qDebug() << "Window title Text: " << QString::fromUtf8(WindowText);
使用 SendMessage获取窗体标题
WCHAR WindowsTitle[MAX_PATH];
if(SendMessageW(GHO_HWMD_C, WM_GETTEXT, MAX_PATH, (LPARAM)WindowsTitle)>0)qDebug() <<QString::fromWCharArray(WindowsTitle);//const int bufferSize = 256;//char buffer[bufferSize];//SendMessageA(GHO_HWMD_C, WM_GETTEXT, bufferSize, (LPARAM)buffer)
使用 DefWindowProcA获取窗体标题
int len = SendMessageA(GHO_HWMD_C, WM_GETTEXTLENGTH, 0, 0) + 1;
// new一块len大小的内存
char *title = new char(len);
// 初始化内存为0
memset(title, 0, len);
// 发送WM_GETTEXT消息获取控件文本
DefWindowProcA(GHO_HWMD_C, WM_GETTEXT, 1024, (LPARAM)title);
使用 GetClassNameA获取窗体类名称
char className[256];
GetClassNameA(GHO_HWMD_C, className, sizeof(className));
qDebug() << "Window class name: " << QString::fromUtf8(className);
使用FindWindowEx获取窗体句柄
/*! https://linuxcpp.0voice.com/?id=132468*/
/*!
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QProcess process;process.start("path/to/your/executable");if (process.waitForStarted()){// 获取进程IDDWORD pid = process.processId();// 获取进程主窗口句柄HWND hwnd = nullptr;do{hwnd = FindWindowEx(nullptr, hwnd, nullptr, nullptr);DWORD windowPid;GetWindowThreadProcessId(hwnd, &windowPid);if (windowPid == pid){// 获取窗口类名char className[256];GetClassName(hwnd, className, sizeof(className));qDebug() << "Window class name: " << QString::fromUtf8(className);break;}} while (hwnd != nullptr);process.waitForFinished();}return a.exec();
}*/
相关文章:
Qt/C++ 获取QProcess启动的第三方软件的窗体标题
Qt/C 获取QProcess启动的第三方软件的窗体标题,在使用EnumWindows获取窗体句柄(HWND)时,如果返回提前FALSE,则获取到的HWND状态IsWindow正常,但就是获取不到窗体标题。必须正常返回TRUE才能使用HWND获取到窗体标题,要不…...
Borland编辑器DOS系统快捷键应用
在项目中接触到DOS系统,该系统距离当下已经接近20年时间,网络上资源较少,因为需要用到C语言编辑器BorlandC,每次应用时难免会忘记快捷键使用,给使用造成很大的不便。 于是把现有收集的快捷键做出整理便于使用,供大家参…...

KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0
KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0 作者: 猫头虎博主 文章目录 KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0🐅摘要引言1. 迁移前的精心准备1.1 系统环境介绍1.2 深度数据验证1.2.…...
Golang抓包:实现网络数据包捕获与分析
介绍 在网络通信中,网络数据包是信息传递的基本单位。抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析。在Golang中,我们可以借助现有的库来实现抓包功能,进一步对网络数据进行分析和处理。 本文将介绍如…...

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比
分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比 目录 分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现QPSO-SVM、PSO-SVM、SVM分类预测对比,运行环境Matlab2018b…...

kubernetes部署jenkins
参考:kubernetes 部署 Jenkins jenkins kubernetes pipeline_mob64ca14116c53的技术博客_51CTO博客 第七篇:kubernetes部署jenkins-CSDN博客 1、当前kubernetes集群已部署nfs服务 showmount -e 创建jenkins目录 2、添加jenkins的pvc kubectl create …...

Node.js详解
一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…...
v-html命令渲染的内容,使用scoped属性的情况下,样式不起作用
v-html命令渲染的内容,使用scoped属性的情况下,样式不起作用 如: CSS: <style scoped> .question_title_text img{ display: block; height: 200px; margin: 10px auto 0 auto;} </style> HTML: <d…...
浅谈vue2.0和vue3.0的区别
Vue3.0相对于Vue2.0有以下改进: Vue 3.0 是一个新版本的 Vue.js,它提供了更高效的渲染性能和更强大的工具链。下面是一些 Vue 3.0 的具体用法: 创建 Vue 实例:与 Vue 2.x 相同,使用 Vue.createApp() 方法创建 Vue 实例…...
git clone报错SSL connect error
解决CentOS 6.6上Git操作引发的SSL连接错误问题 最近在处理一个CentOS 6.6服务器上的问题时,遇到了一个比较棘手的问题。我的小伙伴在操作Git时,发现无法执行git pull命令,提示找不到Git组件。在这篇文章中,我会详细介绍我们是如…...

LeetCode(26)判断子序列【双指针】【简单】
目录 1.题目2.答案3.提交结果截图 链接: 判断子序列 1.题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(…...
学习c#的第十五天
目录 C# 预处理器指令 C# 预处理器指令列表 #define 预处理器 条件指令 #warning 和 #error #region 和 #endregion #line #pragma C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上&#…...
TrafficGPT: Viewing, Processing, and Interacting with Traffic Foundation Models
这篇论文的标题是“TrafficGPT: Viewing, Processing, and Interacting with Traffic Foundation Models”,它探讨了将大型语言模型(如ChatGPT)与交通基础模型结合的潜力和应用。主要内容包括: 论文背景:论文指出&…...

SPASS-参数估计与假设检验
参数估计 点估计 点估计用样本统计量的值直接作为总体参数的估计值。如用样本均值直接作为总体均值的估计值,用样本方差直接作为总体方差的估计值等。 常用的点估计法 (1)矩估计法 (2)极大似然估计法 (3)稳健估计法 区间估计 因为点估计直接用样本估计值作为总体参数…...
虚拟博物馆和纪念馆全景漫游
VR全景漫游 今天不写代码,小郭我从网上找了许多虚拟展览的网站,主要分为博物馆和纪念馆,在这里总结分享给大家,大家在家中就能做到全景漫游中国的博物馆和纪念馆啦! 中国国家博物馆数字展厅 中国数字科技馆 博物馆…...

chrome 浏览器个别字体模糊不清
特别是在虚拟机里,有些字体看不清,但是有些就可以,设置办法: chrome://settings/fonts 这里明显可以看到有些字体就是模糊的状态: 把这种模糊的字体换掉即可解决一部分问题。 另外,经过观察,…...

Resolume Arena 7.15.0(VJ音视频软件)
Resolume Arena 7是一款专业的实时视觉效果软件,用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具,可以将音频、视频和图像合成在一起,创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式,包括视频文…...

Java设计模式
1.设计模式概述 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓 的、经过分类编目的、代码设计经验的总结。 1.创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。提供了单例、原型、工厂方法、抽象工…...

平均分(C++)
系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
2023年11月15日,对.net的开发圈是一个重大的日子,.net 8.0正式版发布。 圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net 5.0的时候就各种吹风Aot编译,直到6.0 7.0使用仍然比较麻烦…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...