一个程序通过窗体句柄控制另一个窗体

接下来,我们来演示不同程序中,怎么通过窗体句柄控制其它程序窗体。

演示的例子是:控制系统的记事本窗体,先移动,再最大化,最后关闭

要求:桌面上有一个记事本,名称是:测试文本.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)关闭记事本结果(图片太大,不截图)

时间: 2024-08-09 02:09:28

一个程序通过窗体句柄控制另一个窗体的相关文章

设计一个程序,让它能够返回一个整数数组最大子数的和,并能完成几项测试

实验人员:常啸帆,毕文强 实验要求:必须能处理1000个元素: 每个元素是int32类型的,出现子数组之和大于显示最大范围会出现什么情况: 输入一个整形数组,有正也有负: 数组中连续的一个或多个整数组成一个数组,每个子数组都必须有一个和: 求所有子数组和的最大值,要求时间复杂度为o(n).实验过程:在本次实验中,我们两人通过所学的c++知识来编写程序,在过程中我们发现了一下问题并逐步解决 在编写的过程中,首先会发现数组中少了一个元素,那是因为在循环时length写成了length-1,     

MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到

对照<第一行代码——Android>进行学习,第五章中说到广播包的相关知识,前面获取广播等程序例程都可以跑的通,但是在5.3.2节中,程序A发送自定义广播,并接收自定义广播,同时程序B也接收该自定义广播.实际编写代码测试程序A发送之后只有程序A收到了改自定义广播,程序B并没有接收到,我认为是我工程配置的问题,因此下载了书本中的例程直接跑,现象任然是这样,程序A发送广播之后只有程序A可以收到,程序B没有收到. 不知道是什么原因,测试的手机是小米2s,系统MIUI7,Android版本5.0.2.

VC中获取窗体句柄的各种方法

AfxGetMainWnd AfxGetMainWnd获取自身窗体句柄HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow函数功能:该函数检查与特定父窗体相联的子窗体z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗体的句柄. 函数原型:HWND GetTopWindow(HWND hWnd):參数: hWnd:被查序的父窗体的句柄.假设该參数为NULL,函数返回Z序顶部的窗体句柄.返回值:    假设函数成功,返回值为在Z序顶部的子窗

一个程序猿可以控制多少行代码

 我认为大家初看到这个题目时,一定会非常奇怪,一个程序猿可以控制多少行代码全然取决于该程序猿的能力强弱,这有什么规律可循么?事实上当这个想法突然冒出来时,我也都有些诧异. 首先介绍一下我遇到的情况,我当时正在编写一个小程序,是模拟cache工作原理的.这个程序中有一个函数集的实现文件(function.cpp),大概由20个左右的函数组成,由main.cpp中的main函数直接去调用它们.这个文件我是从头開始一点一点码起来的,開始时都非常顺利,编写代码的速度也非常平稳.可是当我的代码达到60

WinCE C#程序,控制启动时只能启动一个程序,使用互斥量来实现,该实现方法测试通过

</pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_4634982" name="code" class="csharp"> </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_

vc++ 在程序中运行另一个程序的方法

在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件

C#:只运行一个程序

一.通过系统事件 1.实现如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; namespace Example { public class SinglonProgram { #region

转载:每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生.今天,我们就来探讨一下有助于我们获取更佳编程风格的一些最好的规则. 每一个程序员要遵守的一些优秀编程风格 代码的可读性至上 代码要能可阅读和可理解,就需要格式化成一致的方式.对函数和变量的命名应有意义,注释的表达应该简洁而准确.并且,准确地记录代码中所有棘手的部分是十分重要的.你必须清楚软件程序为什么能工作以及为什么能在所有可能的情况下顺利工作的原因. 遵循正确的命名约定是必须的 当需要给

第一次自己去做一个程序,而不是照着书本上的代码打程序。

我之前想过用窗体做这个关于运算程序出来,因为那样可以让用户更加一目了然,更加方便的使用.但是一直在研究了好久之后,发现不知道该怎么样让用户在点击+-*/按钮的时候能够自动列出算式以及自动运用于计算.所以最终还是选择了用控制台应用程序来做. 这个程序大概是可以应用于小学,让低年级的小学生自己在电脑上做作业,既能够开发学生的思维,也可以借助小学生对电脑的兴趣来让他们对学习动脑更加努力. 设计思路大概就是运用之前学过树上的加法随机数运算,改变运算的规律,算法.运用计算机的计算功能以及if.else语句