一个程序通过窗体句柄控制另一个窗体
接下来,我们来演示不同程序中,怎么通过窗体句柄控制其它程序窗体。
演示的例子是:控制系统的记事本窗体,先移动,再最大化,最后关闭
要求:桌面上有一个记事本,名称是:测试文本.txt - 记事本,保证是打开的
界面只有一个按钮,btnCloseText
引用的windowapi函数dll如下:
/// <summary>/// 获取窗体的句柄函数/// </summary>/// <param name="lpClassName">窗口类名</param>/// <param name="lpWindowName">窗口标题名</param>/// <returns>返回句柄</returns>[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);/// <summary>/// 移动窗体的函数/// </summary>/// <param name="hWnd">窗体句柄</param>/// <param name="x">窗体新位置x轴坐标</param>/// <param name="y">窗体新位置y轴坐标</param>/// <param name="nWidth">窗体新位置宽度</param>/// <param name="nHeight">窗体新位置高度</param>/// <param name="BRePaint">是否刷新窗体</param>/// <returns></returns>[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);/// <summary>/// 通过句柄,窗体显示函数/// </summary>/// <param name="hWnd">窗体句柄</param>/// <param name="cmdShow">显示方式</param>/// <returns>返工成功与否</returns>[DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]public static extern bool ShowWindow(IntPtr hWnd, int cmdShow);/// <summary>/// 发送消息到窗体函数/// </summary>/// <param name="hwnd">窗体句柄</param>/// <param name="wMsg">消息类型</param>/// <param name="wParam">附带消息</param>/// <param name="lParam"></param>/// <returns></returns>[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]public static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
实现代码:
//wMsg类型,关闭窗体private const int WM_CLOSE = 0x10;private void btnCloseText_Click(object sender, EventArgs e){IntPtr textHandle = FindWindow(null, "测试文本.txt - 记事本");if (textHandle != IntPtr.Zero){//移动记事本窗体MoveWindow(textHandle, 0, 100, 800, 600, true);//延时3秒后Thread.Sleep(3000);//设置窗体最大化显示ShowWindow(textHandle, 3);//延时3秒后Thread.Sleep(3000);//向记事本程序窗体发送关闭信息SendMessage(textHandle, WM_CLOSE,0,0);}}
整体代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace WindowsForms {public partial class Form2 : Form{public Form2(){InitializeComponent();}/// <summary>/// 获取窗体的句柄函数/// </summary>/// <param name="lpClassName">窗口类名</param>/// <param name="lpWindowName">窗口标题名</param>/// <returns>返回句柄</returns>[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);/// <summary>/// 移动窗体的函数/// </summary>/// <param name="hWnd">窗体句柄</param>/// <param name="x">窗体新位置x轴坐标</param>/// <param name="y">窗体新位置y轴坐标</param>/// <param name="nWidth">窗体新位置宽度</param>/// <param name="nHeight">窗体新位置高度</param>/// <param name="BRePaint">是否刷新窗体</param>/// <returns></returns>[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);/// <summary>/// 通过句柄,窗体显示函数/// </summary>/// <param name="hWnd">窗体句柄</param>/// <param name="cmdShow">显示方式</param>/// <returns>返工成功与否</returns>[DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]public static extern bool ShowWindow(IntPtr hWnd, int cmdShow);/// <summary>/// 发送消息到窗体函数/// </summary>/// <param name="hwnd">窗体句柄</param>/// <param name="wMsg">消息类型</param>/// <param name="wParam">附带消息</param>/// <param name="lParam"></param>/// <returns></returns>[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]public static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);//wMsg类型,关闭窗体private const int WM_CLOSE = 0x10;private void btnCloseText_Click(object sender, EventArgs e){IntPtr textHandle = FindWindow(null, "测试文本.txt - 记事本");if (textHandle != IntPtr.Zero){//移动记事本窗体MoveWindow(textHandle, 0, 100, 800, 600, true);//延时3秒后Thread.Sleep(3000);//设置窗体最大化显示ShowWindow(textHandle, 3);//延时3秒后Thread.Sleep(3000);//向记事本程序窗体发送关闭信息SendMessage(textHandle, WM_CLOSE,0,0);}} } }
演示结果如下:
1)刚开始运行结果(图片太大,不截图)
2)窗体移动后结果(图片太大,不截图)
3)最大化窗体结果(图片太大,不截图)
4)关闭记事本结果(图片太大,不截图)
一个程序通过窗体句柄控制另一个窗体相关推荐
- Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所
**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府. ...
- 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.编写一个程序,从命令行得到一个整数,判断该数是不是回文数 package Text6;import java.util.Scanner; ...
- 有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数。
package task08;import java.util.Scanner;/** 8.有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.* 编写一个程序,从命令行得到一个整数,判断 ...
- 面试了一个程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...
首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...
- 你为什么选择成为一个程序员,你适合做一个软件开发工程师吗?
选择一个职业也许有许多理由,那你为什么选择做了一个程序员呢? 作为一个标准的80后老猿,我来说一下自己的亲身体会,也给想入门的小白一个心理评估. 本人开发15余年,随没有太大的建树,但也有自己的些许经 ...
- java 1000个线程_java,一个程序建立1000个线程,每一个线程加1到一个变量sum。
1.程序建立1000个线程,有可能造成系统创建大量线程而导致消耗完系统内存,还会增加创建和销毁线程上所花的时间以及系统资源的开销 2.在创建线程数多的情况下,可以考虑使用线程池 以下是Java自带的几 ...
- python类中调用另一个程序函数_Python:如何在另一个类中调用函数
我被一些python脚本困住了 https://python4kids.brendanscott.com/2014/12/02/hooking-up-the-sunfish-chess-engine- ...
- android一个程序叫什么名字,1第一个Android应用程序
第一个程序从 Hello World 開始?? 或许C语言学习是从这開始的,可是书上不是这么開始的,或许起点就决定了高度?? 一.新建安卓项目 (1)选择安卓项目 (2)随便建个名字的项目,默认下一步 ...
- 编一个程序完成从键盘上输入一个4位的16进制数,并以八进制形式显示出来。
思路: 无论输入的是0123--abcdef,还是0123--ABCDEF都可以被解析为16进制字符 DATAS SEGMENTcrlf db 0dh,0ah,24h DATAS ENDSSTACKS ...
最新文章
- 归根到底,大家都是出来卖的!有的人月入十万,有的人月入三千!差距!
- wxWidgets:wxListItem类用法
- android内存及内存溢出分析
- mysql 密码修改时间_Mysql修改密码的方法
- 价值5000的三网免挂码支付系统
- 一个简化的插件框架c#
- ConstraintLayout约束控件详解
- 如何在手机浏览器中实现条形码/QR码扫描
- html转义字符 放大镜,特殊符号
- java计算机毕业设计springboot+vue城市轨道交通线路查询系统-公交车线路查询
- C++求球的面积与体积,公式一样输出结果不一样?
- 网络准入控制学习——Chap1
- 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
- 另类办公Word2003也当“扫描大师”(转)
- JAVA毕设项目九宫格日志网站(java+VUE+Mybatis+Maven+Mysql)
- 网络安全立法探讨(Cyber Security Laws discussion):立法是否应该更严格?
- jenkins 邮件配置展示change信息
- GIS空间分析之密度分析
- 对全息体光栅的精确建模
- ESP8266开发-Arduino IDE安装、配置与使用
热门文章
- cesium 基于在vue框架写功能
- pcl 使用gpu计算法向量_异构计算系列文章(一):定义、场景及局限性
- 智能机器人建房子后房价走势_日本房价走势分析:房产投资是否“未来可期”?...
- 下载 LINUX 和 windows 版本下 MySQL5.7.32
- 荒岛余生最后一个包裹_你会为一个排球哭泣吗?电影《荒岛余生》
- Linux省级精品课程申报,2016年度省级精品在线开放课程开始申报啦!
- window.open ()的用法
- 更改mysql数据库存储引擎_MySQL更改数据库表的存储引擎
- 服务器怎么控制忽略样式_看问题要看到本质:从Web服务器说起
- 计算机课又叫什么课,计算机课学电脑的书叫什么?