一個程序通過窗體句柄控制另一個窗體


接下來,我們來演示不同程序中,怎么通過窗體句柄控制其它程序窗體。

演示的例子是:控制系統的記事本窗體,先移動,再最大化,最后關閉

要求:桌面上有一個記事本,名稱是:測試文本.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)關閉記事本結果(圖片太大,不截圖)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM