一、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官网查看

这样就实现了点击其他程序里的按钮操作!

  

个人网站:http://www.xtyos.cn
github:https://github.com/2629180692
博客园:http://www.cnblogs.com/wurendao
完成日期 2020-02-10 无人岛
遇到什么问题欢迎到下面评论里提出或者联系我哦!

【转载文章务必保留出处和署名,谢谢!】

在C#中使用 SendMessage 实现操作外部其他程序上的控件教程的更多相关文章

  1. [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?

    目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...

  2. WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)

    最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...

  3. C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0

    原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0 前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题. ...

  4. 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它

    //创建一个委托,是为访问listbox控件服务的. public delegate void UpdateTxt(string msg); //定义一个委托变量 public UpdateTxt u ...

  5. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)

    引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...

  6. WPF中在摄像头视频上叠加控件的解决方案

    一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...

  7. wpf中在style的template寻找ControlTemplate和DataTemplate的控件

    一.WPF中的两棵树 WPF中每个控件的Template都是由ControlTemplate构成,ControlTemplate包含了构成该控件的各种子控件,这些子控件就构成了VisualTree:而 ...

  8. asp.net中遍历界面上所有控件进行属性设置

    * 使用方法: *  前台页面调用方法,重置:    protected void Reset_Click(object sender, EventArgs e)        {           ...

  9. ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)

    前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...

随机推荐

  1. [Lua游戏AI开发指南] 笔记零 - 框架搭建

    一.图书详情 <Lua游戏AI开发指南>,原作名: Learning Game AI Programming with Lua. 豆瓣:https://book.douban.com/su ...

  2. Spring Cloud与Spring Boot版本匹之间的关系

    由于学习的起步较晚,创建项目的时候一直采用的都是较新的springboot,用的2.0.2.RELEASE版本.参照网上的示例进行实验的时候,有时候会才坑,特记录一二以备忘 首先就是SpringBoo ...

  3. 解释WEB 模块?

    Spring的WEB模块是构建在application context 模块基础之上,提供一个适合web应用的上下文.这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参 ...

  4. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?

    用Spring的 SessionFactory 调用 LocalSessionFactory.集成过程分三步: 配置the Hibernate SessionFactory. 继承HibernateD ...

  5. Redis 最适合的场景?

    1.会话缓存(Session Cache) 最常用的一种使用 Redis 的情景是会话缓存(session cache).用 Redis 缓存会 话比其他存储(如 Memcached)的优势在于:Re ...

  6. vue中ajax请求发送

    示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  7. 自定义XML文件模板步骤

  8. Numpy求解线性方程组

    Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证

  9. vue H5 超简单的swiper制作抖音上拉切换视频播放

    -----html部分------ <swiper vertical :style="{height: windowheight+'px',width:375+'px'}" ...

  10. Kurento安装与入门02——运行示例前的准备

    官方一共提供了13个示例,这些示例运行的方式大同小异,一般会提供JAVA.Browser JavaScript.Node.js三种版本,这里仅演示java版本的示例.这些示例要求系统内已经正确安装了K ...