-
在C#中使用 SendMessage 实现操作外部其他程序上的控件教程
一、C#代码实现
本案例使用的是c# winform .NET Framework 4.7.2
首先我们声明一个寻找窗体的函数
1
2
|
[DllImport( "User32.dll" , EntryPoint = "FindWindow" )] public static extern IntPtr FindWindow( string lpClassName, string lpWindowName); |
然后我们调用此函数去寻找要操作的窗体程序
1
2
|
IntPtr ParenthWnd = new IntPtr(0); ParenthWnd = YSQ.FindWindow( null , "123" ); |
第一个参数是窗体的类名、第二个参数是窗体的标题,二者必须要有一个。这里推荐vs自带的 spy++ 工具查看窗体参数
然后我们再声明一个寻找窗体里按钮的函数
1
2
|
[DllImport( "User32.dll" , EntryPoint = "FindWindowEx" )] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName); |
参数说明:
|
主窗体句柄、第一步调用 FindWindow 函数返回的值 | ||
|
子窗体的句柄,可空 | ||
|
要寻找的控件的类名 | ||
|
要寻找的控件的标题 |
然后我们调用此函数寻找窗体里的 “连接” 按钮。
1
2
3
4
|
IntPtr btnPtr = YSQ.FindWindowEx(ParenthWnd, IntPtr.Zero, "Button" , "连接" ); YSQ.PostMessage(btnPtr, 0x201, 0, 0); YSQ.PostMessage(btnPtr, 0x202, 0, 0); textBox1.AppendText($ "点击【连接】按钮,按钮句柄:{btnPtr}\r\n\r\n" ); |
然后我们还需要定义一个给窗体发送消息的函数
1
2
|
[DllImport( "User32.Dll" , EntryPoint = "PostMessageA" )] public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam); |
然后调用 PostMessage 函数发送鼠标按下的消息
1
2
|
YSQ.PostMessage(btnPtr, 0x201, 0, 0); YSQ.PostMessage(btnPtr, 0x202, 0, 0); |
//按下鼠标左键
WM_LBUTTONDOWN = 0x201
//释放鼠标左键
WM_LBUTTONUP = 0x202
更多函数代码请移步MSDN官网查看
这样就实现了点击其他程序里的按钮操作!
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数