接下來,我們來演示不同程序中,怎么通過窗體句柄控制其它程序窗體。
演示的例子是:控制系統的記事本窗體,先移動,再最大化,最后關閉
要求:桌面上有一個記事本,名稱是:測試文本.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)關閉記事本結果(圖片太大,不截圖)
