在C#中使用 SendMessage 实现操作外部其他程序上的控件教程
一、C#代码实现
本案例使用的是c# winform .NET Framework 4.7.2
首先我们声明一个寻找窗体的函数
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
然后我们调用此函数去寻找要操作的窗体程序
IntPtr ParenthWnd = new IntPtr(0);
ParenthWnd = YSQ.FindWindow(null, "123");

第一个参数是窗体的类名、第二个参数是窗体的标题,二者必须要有一个。这里推荐vs自带的 spy++ 工具查看窗体参数
然后我们再声明一个寻找窗体里按钮的函数
[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
参数说明:
hwndParent |
主窗体句柄、第一步调用 FindWindow 函数返回的值 |
hwndChildAfter |
子窗体的句柄,可空 |
lpClassName |
要寻找的控件的类名 |
lpWindowName |
要寻找的控件的标题 |
然后我们调用此函数寻找窗体里的 “连接” 按钮。
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");
然后我们还需要定义一个给窗体发送消息的函数
[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
然后调用 PostMessage 函数发送鼠标按下的消息
YSQ.PostMessage(btnPtr, 0x201, 0, 0);
YSQ.PostMessage(btnPtr, 0x202, 0, 0);
//按下鼠标左键
WM_LBUTTONDOWN = 0x201
//释放鼠标左键
WM_LBUTTONUP = 0x202
更多函数代码请移步MSDN官网查看
这样就实现了点击其他程序里的按钮操作!
github:https://github.com/2629180692
博客园:http://www.cnblogs.com/wurendao
完成日期 2020-02-10 无人岛
遇到什么问题欢迎到下面评论里提出或者联系我哦!
【转载文章务必保留出处和署名,谢谢!】
在C#中使用 SendMessage 实现操作外部其他程序上的控件教程的更多相关文章
- [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?
目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...
- WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)
最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...
- C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0
原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0 前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题. ...
- 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它
//创建一个委托,是为访问listbox控件服务的. public delegate void UpdateTxt(string msg); //定义一个委托变量 public UpdateTxt u ...
- 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)
引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...
- WPF中在摄像头视频上叠加控件的解决方案
一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...
- wpf中在style的template寻找ControlTemplate和DataTemplate的控件
一.WPF中的两棵树 WPF中每个控件的Template都是由ControlTemplate构成,ControlTemplate包含了构成该控件的各种子控件,这些子控件就构成了VisualTree:而 ...
- asp.net中遍历界面上所有控件进行属性设置
* 使用方法: * 前台页面调用方法,重置: protected void Reset_Click(object sender, EventArgs e) { ...
- ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)
前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...
随机推荐
- 保姆教程系列二、Nacos实现注册中心
前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到 保姆教程系列一.Linux搭建Nacos 注册中心原理 一.环境准备 Java版本:1.8+ (Linux ce ...
- String s = new String("xyz");创建了几个字符串对象?
两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象.
- ZAB 协议?
ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广 播协议. ZAB 协议包括两种基本的模式:崩溃恢复和消息广播. 当整个 zookeeper 集群刚刚启动或者 L ...
- npm run start 后台运行
yum provides */nohup nohup npm start & 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用. 停止程序 ps -ef ...
- 解决IDEA包重叠在一起的问题
问题显现: 解决方法:
- s函数
Matlab 中S-函数模板翻译 10.0 基础知识 (1)Simulink仿真过程 Simulnk仿真分为两步:初始化.仿真循环.仿真是由求解器控制的,求解器主要作用是:计算模块输出.更新模块离散状 ...
- Python中的numpy库介绍!
转自:https://blog.csdn.net/codedz/article/details/82869370 机器学习算法中大部分都是调用Numpy库来完成基础数值计算的.安装方法: pip3 i ...
- jquery+html5+canvas实现图片 预览 压缩 上传
javascirpt (function($){ $.fn.extend({ aiiUpload:function(obj) { if(typeof obj !="object") ...
- 如何使用vue-cli搭建好的项目
本人是一枚前端小白,也是从零开始学习vue.js.由于闲着蛋疼,写一点自己的经验,可能有点low.是新手想上道的话,可以看看,如果有大神,也可以给我指导一下,小生感激不尽. 关于如何使用vue-cli ...
- AMS分析 -- 启动过程
一. AMS简介 AmS可以说是Android上层系统最核心的模块之一,其主要完成管理应用进程的生命周期以及进程的Activity,Service,Broadcast和Provider等. 从系统运行 ...