C# 得到另外一個窗體句柄併發送消息

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
 
namespace findWindowTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        // Find Window
        // 查找窗體
        // @para1: 窗體的類名 例如對話框類是"#32770"
        // @para2: 窗體的標題 例如打開記事本 標題是"無標題 - 記事本" 注意 - 號兩側的空格
        // return: 窗體的句柄
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string className, string windowName);
       
       
       
       
       
        // Find Window Ex
        // 查找窗體的子窗體
        // @para1: 父窗體的句柄 若是爲null,則函數以桌面窗口爲父窗口,查找桌面窗口的全部子窗口
        // @para2: 子窗體的句柄 若是爲null,從@para1的直接子窗口的第一個開始查找
        // @para3: 子窗體的類名 爲""表示全部類
        // @para4: 子窗體的標題 爲""表示要查找的窗體無標題 如空白的textBox控件
        // return: 子窗體的句柄
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(
            IntPtr hwndParent,
            IntPtr hwndChildAfter,
            string lpszClass,
            string lpszWindow);
 
        // SendMessage
        // 向窗體發送消息
        // @para1: 窗體句柄
        // @para2: 消息類型
        // @para3: 附加的消息信息
        // @para4: 附加的消息信息
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(
            IntPtr hWnd,
            int Msg,
            IntPtr wParam,
            string lParam);
 
        // 消息類型(部分)
        const int WM_GETTEXT     = 0x000D;  // 得到窗體文本 如得到對話框標題
        const int WM_SETTEXT     = 0x000C;  // 設置窗體文本 如設置文本框內容
        const int WM_CLICK       = 0x00F5;  // 發送點擊消息如調用該窗體(按鈕)的"button1_Click();"
 
        // 本程序針對指定的另外一程序窗體所以聲名了以下變量
        IntPtr Wnd  = new IntPtr(0);// 一卡通註冊程序主窗體
        IntPtr sWnd = new IntPtr(0);// GroupBox控件 此爲「一卡通註冊程序」主窗體的子窗體
        IntPtr txt  = new IntPtr(0);// 文本框
        IntPtr btn1 = new IntPtr(0);// 查詢按鈕
        IntPtr btn2 = new IntPtr(0);// 註冊按鈕 這三個窗體又爲「GroupBox控件」的子窗體
        //IntPtr popW = new IntPtr(0);// 彈出對話框
        //IntPtr popB = new IntPtr(0);// 彈出對話框肯定按鈕
 
        // 文件操做
        private String filename = string.Empty;
        private StreamReader reader = null;
 
        // 從「打開文件」對話框打開txt文件 同時得到須要的窗口句柄
        private void button2_Click(object sender, EventArgs e)
        {
            label2.Text = "";
            openFileDialog1.DefaultExt = "txt";
            openFileDialog1.Filter = "文本文件|*.txt";
            openFileDialog1.RestoreDirectory = true;
            openFileDialog1.FilterIndex = 1;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                filename = openFileDialog1.FileName;
            }
 
            // 得到窗口句柄
            Wnd  = FindWindowEx((IntPtr)0, (IntPtr)0, null, "讀者一卡通註冊");// 一個註冊程序的窗體
            sWnd = FindWindowEx(Wnd,  (IntPtr)0, null, "條件"); // 窗體上的一個GroupBox控件
            txt  = FindWindowEx(sWnd, (IntPtr)0, null, "");     // GroupBox內的textBox控件
            btn1 = FindWindowEx(sWnd, (IntPtr)0, null, "查詢"); // GroupBox內的查詢按鈕
            btn2 = FindWindowEx(sWnd, (IntPtr)0, null, "註冊"); // GroupBox內的註冊按鈕
        }
 
        // 重複地把文件內讀取的行
        // 將該行發送給註冊程序窗體上的文本框中
        // 並「點擊」查詢按鈕和註冊按鈕
        // 直到文件讀取完畢
        private void button3_Click(object sender, EventArgs e)
        {
            //計數
            int count = 0;
 
            //讀取文件
            if (filename == string.Empty)
            {
                button2.Focus();
                return;
            }
 
            reader = new StreamReader(filename);
            if (reader.EndOfStream)
            {
                return;
            }
 
            string str = string.Empty;
 
            do
            {
                //讀取學號 保存在變量str中
                str = reader.ReadLine();
 
                //設置學號
                SendMessage(txt, WM_SETTEXT, (IntPtr)0, str);
 
                //點擊查詢按鈕
                SendMessage(btn1, WM_CLICK, (IntPtr)0, "");
 
                //點擊註冊按鈕
                SendMessage(btn2, WM_CLICK, (IntPtr)0, "");
 
                count++;
            }
            while(!reader.EndOfStream);
 
            reader.Close();
            filename = string.Empty;
            label1.Text = "註冊人數:";
            label2.Text = Convert.ToString(count);
        }
    }
}
相關文章
相關標籤/搜索