C++QT获取其他exe的输入edit控件id并且设置edit内容

2023-10-30

找到exe的窗口句柄

找到窗口的句柄有很多种方法,可以根据需求来选择操作。

1.知道exe的窗口类名已或者标题名字

你可以通过
vsSpy++来找到窗口类名
例如系统自带的计算器的窗口名字为计算器,通过查找我们在spy找到了
在这里插入图片描述
然后右键属性就能找类名在这里插入图片描述
这样可以通过FindWindowExA 来获取窗口id,并且设置名字为我的计算器

	HWND pWnd = FindWindowExA(0, 0, "ApplicationFrameWindow","计算器");
	printf("%p --->计算器的窗口\n", pWnd);
	SendMessage(pWnd, WM_SETTEXT, 0, (LPARAM)"老子的计算器");

	

在这里插入图片描述
可以看到名字已经变了,但是为什么计算器的那个名字没有变了呢?那是因为计算器这个是窗口子控件的显示,需要变了子控件来进行修改,这个后面再来讲。

2.不知道窗口名字类等等,只知道exe的启动名字

因为各种原因,比如相同类的名字窗口很多,或者窗口没有标题,又或者找不到窗口名字和类名(启动程序名字和实际窗口标题不一样)等等都会造成无法进行查找指定的窗口HWND。打个最简单的比方
在这里插入图片描述
我要获取的注册框里面的输入框edit的HWND,但是这个窗口不是父窗口的内容,是新的窗口,且这个窗口没有名字以及很难找的类名,直接搜索主窗口的类名和标题是无法搜索出这个的。
此窗口为刚刚的那个注册窗口
此窗口为刚刚的那个窗口,可以看出没有任何标题名字,要一个个看,要在上百个窗口中找出这个窗口是一个非常难得事情。
因此需要在线程中检索出所有窗口的内容,具体代码如下

#include <windows.h>
#include <stdint.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <vector>
#include <iostream>


typedef struct EnumHWndsArg
{
	std::vector<HWND> *vecHWnds;
	DWORD dwProcessId;
}EnumHWndsArg, *LPEnumHWndsArg;

HANDLE GetProcessHandleByID(int nID)//通过进程ID获取进程句柄
{
	return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}

DWORD GetProcessIDByName(const char* pName)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == hSnapshot) {
		return NULL;
	}
	PROCESSENTRY32 pe = { sizeof(pe) };
	for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
		if (strcmp(pe.szExeFile, pName) == 0) {
			CloseHandle(hSnapshot);
			return pe.th32ProcessID;
		}
		//printf("%-6d %s\n", pe.th32ProcessID, pe.szExeFile);
	}
	CloseHandle(hSnapshot);
	return 0;
}

BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{
	EnumHWndsArg *pArg = (LPEnumHWndsArg)lParam;
	DWORD  processId;
	GetWindowThreadProcessId(hwnd, &processId);
	if (processId == pArg->dwProcessId)
	{
		pArg->vecHWnds->push_back(hwnd);
		//printf("%p\n", hwnd);
	}
	return TRUE;
}

void GetHWndsByProcessID(DWORD processID, std::vector<HWND> &vecHWnds)
{
	EnumHWndsArg wi;
	wi.dwProcessId = processID;
	wi.vecHWnds = &vecHWnds;
	EnumWindows(lpEnumFunc, (LPARAM)&wi);
}

HWND GetChildHWnd(HWND mHwnd, int ID)  //mHwnd是主窗口句柄,ID是控件的ID
{

	HWND mIDHWnd=NULL, mChildHWnd=NULL;    //mIDHWnd返回的控件句柄,mChildHWnd是主窗口的子窗口句柄
	while (mHwnd)
	{
		int id = 0;

		id = ::GetDlgCtrlID(mHwnd);
		printf("id=%d\n", id);
		if (id == ID)
		{
			mIDHWnd = mHwnd;
			break;
		}
		if (mChildHWnd = ::GetWindow(mHwnd, GW_CHILD))
		{
			GetChildHWnd(mChildHWnd, ID);
		}
		mHwnd = ::GetWindow(mHwnd, GW_HWNDNEXT);
	}
	return mIDHWnd;
}


int32_t main()
{

	DWORD pid = GetProcessIDByName("data1111.exe");
	printf("pid = %u\n", pid);
	if (pid != 0)
	{
		std::vector<HWND> vecHWnds;
		GetHWndsByProcessID(pid, vecHWnds);
		printf("vecHWnds.size() = %u\n", vecHWnds.size());
		HWND h = vecHWnds[0];
		HWND parent = GetParent(h);
		HWND pchind6 = ::FindWindowExA(h, 0, "Edit", NULL);
		Sleep(5000);
		while (pchind6 != NULL)
		{
			SendMessage(pchind6, WM_SETTEXT, 0, (LPARAM)"你好呀");
			printf("%p --->edit\n", pchind6);
			pchind6 = ::FindWindowExA(h, pchind6, "Edit", NULL);
			Sleep(1000);

		}
	}
	getchar();
	return S_OK;
}

假设我已经知道了
在这里插入图片描述
启动程序的名字,且注册窗口为第一控件ID,因为注册窗口在前所有顺序也靠前,通过FindWindowExA检索出edit的类名的所有控件id然后SendMessage发送指定消息即可。

使用后截图
当然你还可以触发确定按钮点击机制,是不是很爽呀。

qt如何使用

qt可以直接将代码复制进去即可使用,但是会遇到乱码问题,你可以先将项目设置为多字节,然后

QTextCodec *codec = QTextCodec::codecForName("utf-8");//修改这两行
SendMessage(vecHWndsEdit[HWndi], WM_SETTEXT, 0, (LPARAM)QString::fromUtf8("问题1").toLocal8Bit().data());

即可解决乱码,别问我头文件是什么,头文件是#include ;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++QT获取其他exe的输入edit控件id并且设置edit内容 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • python recvfrom设置超时_如何在python的socket recv方法上设置超时?

    我需要在python的socket recv方法上设置超时 怎么做 仅供参考 如果您选择使用超时 您需要知道如何处理超时 这个SO问题讨论了超时发生时的处理 stackoverflow com questions 16745409 典型的方
  • elementui实现横向时间轴_横向时间轴(进度条)

    1 2 3 4 5 6 7 8 9 10 timeline box 11 width 100 12 height 8rem 13 position relative 14 15 16 timeline container 17 height
  • 2023 年及未来最佳的软件构建工具

    当今世界 加快任务完成速度和尽可能减少人力投入是一切事物都需要关注的问题 软件开发也不例外 无论你在哪个领域 游戏 区块链 还是应用创建 软件开发的竞争都异常激烈 只要能够帮助到你 采用任何手段都无关紧要 而这也正是构建工具的作用 这些工具
  • Linux——I/O复用(2)—— poll和epoll

    poll原型 poll系统调用和select类似 也是在指定时间内轮询一定数量的文件描述符 以 测试其是否有就绪者 int poll struct pollfd fds int nfds int timeout fds struct pol
  • JAVA笔记--异常处理(第一篇)

    目录 一 异常概念 1 什么是异常 2 try与catch关键字 二 try catch finally 1 catch 2 异常处理过程分析 3 finally 三 throw throws与异常规则 1 throw throws 2 异
  • Unity3d 通过json文件使用C#脚本代码生成多个相机

    首先设计一个存储相机类型的json类如下 using UnityEngine using System using System Collections Serializable public class Cameras public in
  • matlab基本粒子群算法实现(四)

    最后在炼数成金那边找到了很好的一篇教程 在这里把它整理一下 做个粒子群算法的收尾 main m I 清空环境 clc clear II 绘制目标函数曲线 figure x y meshgrid 5 0 1 5 5 0 1 5 z x 2 y
  • 阿里巴巴一道笔试题

    其实这是谷歌的一道面试题 给定能随机生成整数1到5的函数 写出能随机生成整数1到7的函数 惭愧 阿里的笔试题做错了 说实话 以前没见过 见过了就把搞懂 阿里题目 给定rand 7 表示能生成1 7的随机数 使用四则运算和循环等控制语句 可以
  • Python基础之循环语句

    Python基础之循环语句 一 循环语句介绍 1 循环语句理解 2 循环语句示意图 二 循环语句的分类 三 循环控制语句 四 while循环 1 while死循环 2 while条件循环 五 break和continue 1 break使用
  • TCP三次握手和四次挥手 详解

    首先了解下TCP报文 16位源端口号 16位的源端口中包含初始化通信的端口 源端口和源IP地址的作用是标识报文的返回地址 16位目的端口号 16位的目的端口域定义传输的目的 这个端口指明报文接收计算机上的应用程序地址接口 32位序号 32位
  • QProcess调用外部程序阻塞等待问题解决

    QProcess调用外部程序阻塞等待问题解决 简介 第一种 第二种 简介 在使用QProcess调用外部程序时 可能会遇到两种场景 1 调用起来之后就不管 直接运行后面的代码 2 调用起来后需要等待外部程序执行完成 在继续运行下面的代码 第
  • jdbc连接数据库获取所有表,表的字段及类型之Oracle

    https blog csdn net hhhliushen article details 105272439 昨天写的这篇jdbc连接数据库获得所有表 表的所有字段及类型对于mysql来说速度还是可以的 但是对于oracle来说 真的是
  • springboot工程中生成二维码(Java)

    需求 在系统中生成一个二维码 用户保存下来并分享出去 其他人扫描之后跳到我们的一个活动详情页 查看此活动的内容 需求分析 从以上的需求中 可以提炼出以下几点 当用户点击生成二维码的时候 我们要拿到用户生成的二维码是关于哪个活动的 请求来到后
  • 前端工程师的摸鱼日常(19)

    图为恐子真身 史记记载恐子九尺六寸高 根据春秋的尺度换算 有一米九至两米多高 人皆畏之 一米九的山东大汉 手下七十二堂口 帮派 三千门生 小弟 由他弟子所编写的 抡语 这是为我们讲述了 春秋道上的规矩 首先 仁义礼智信 并不是字面上的意思
  • Matlab:生成特定范围的随机数

    Matlab 生成特定范围的随机数 在Matlab中 我们可以使用rand函数来生成随机数 但有时候我们只需要在特定的范围内生成随机数 这时候 我们可以使用Matlab提供的一些函数来实现 生成0到1之间的随机数 如果需要生成0到1之间的随
  • FISCO BCOS上使用第三方CA证书底层节点部署实操

    CA证书怎么生成 节点相互验证证书时会交叉验证吗 对于社区常遇到的此类问题 分享一些个人使用第三方CA证书部署底层节点的经验 希望可以给大家一些借鉴与参考 为什么要对第三方CA证书进行改造 首先 说明一下我进行第三方CA证书改造的背景和原因
  • eNSP静态综合试验(作业)

    整体思路 一 子网划分 IP地址网段规划 二 配置ip地址 底层 所有节点拥有合法ip地址 三 添加 配置路由 全网可达 配置静态路由表 添加缺省路由 四 添加浮动静态 五 给黑洞路由器添加空接口路由 防止成环 注 全程应及时测试 一 子网
  • 互联网安全架构设计

    面试题 你们项目的安全性是如何保证的 1 Web安全常见攻击手段 SQL注入攻击 开放平台设计 1 基于access token令牌的方式 access token的作用 记录上次最新的access token 防止用户获取到token后恶
  • 一个可以免费下载牛逼论文的网站Arxiv

    Arxiv是什么 Arxiv是一个免费张贴和下载预印本的网站 最初用于高能物理和粒子物理学家之间的交流 如今已经发展到了物理学的各个领域 且延伸到了物理 数学 非线性科学 计算机科学 数量生物学 数量金融学 统计学等多个领域 网址 http
  • C++QT获取其他exe的输入edit控件id并且设置edit内容

    C QT获取其他exe的edit控件id并且设置edit内容 找到exe的窗口句柄 1 知道exe的窗口类名已或者标题名字 2 不知道窗口名字类等等 只知道exe的启动名字 qt如何使用 找到exe的窗口句柄 找到窗口的句柄有很多种方法 可