在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闭包来实现的,而并不是用 ...
随机推荐
- Ajax的核心的对象是什么?
Ajax的核心对象是XMLXMLHttpRequest 对象. XMLHttpRequest提供不重新加载页面的情况下更新网页,在页面加载后在客户端向服务器请求数据,在页面加载后在服务器端接受数据,在 ...
- C printf格式化输出
转载:https://blog.csdn.net/wucz122140729/article/details/98434702 格式化输出 格式化输出的函数有printf.sprintf和 ...
- (4)_结果与讨论Result and Discussion【论文写作】
- React 可视化开发工具 shadow-widget 的非可视开发方法
Shadow Widget 提倡在可视设计器中开发用户界面,输出转义标签,而非 JSX.许多童鞋可能不知道 SW 同样支持用 JSX 设计界面,开发体验比原生 React 编程好出很多,本文就介绍这方 ...
- vuex基础详解
vuex入门 安装 vuex为我们提供了两种使用方法 直接引入 vuex下载地址:https://unpkg.com/vuex@2.0.0 下载之后用< script >标签包裹引入即可 ...
- TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job?
TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job? 面试官:"已完成 Job 的 TTL 机制了解嘛?简单说说TTL存在 ...
- java堆排序
直接贴源代码: package com.java.fmd; import java.util.Scanner; public class HeapSort { int[] arr; public st ...
- java基础-File
File类 * File更应该叫做一个路径, 文件路径或者文件夹路径 * 路径分为绝对路径和相对路径 * 绝对路径是一个固定的路径,从盘符开始 * 相对路径相对于某个位置,在eclipse下 ...
- CSS简单样式练习(二)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- 用 rollup + gulp 造个轮子,别说还挺香
前戏 我是16年入了前端的坑,17年知道了gulp和rollup这两个玩意儿.由于那时webpack势头很猛,便一直没有正眼瞧过它一眼. 直到20年进了一家小公司,做了很多类似的小项目,相同的代码拷来 ...