兩個winform.exe程式之間的通訊一————————傳送訊息
阿新 • • 發佈:2018-11-02
1,兩個winform.exe在系統裡體現是兩個程序,而程序是是由系統管理。
2,user32.dll是Windows使用者介面相關應用程式介面,用於包括Windows處理,基本使用者介面等特性,如建立視窗和傳送訊息。
3,所有可以通過呼叫user32.dll的api來進行兩個程序之間的通訊。
4,傳送端exe.原始碼
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.Tasks; using System.Windows.Forms; namespace Send { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } public const int WM_COPYDATA = 0x004A; //當一個應用程式傳遞資料給另一個應用程式時傳送此訊息指令 //通過視窗的標題來查詢視窗的控制代碼 [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); //在DLL庫中的傳送訊息函式 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage ( int hWnd, // 目標視窗的控制代碼 int Msg, // 在這裡是WM_COPYDATA int wParam, // 第一個訊息引數 ref CopyDataStruct lParam // 第二個訊息引數 ); private void button1_Click(object sender, EventArgs e) { //將文字框中的值, 傳送給接收端 string text = textBox1.Text; CopyDataStruct cds; cds.dwData = (IntPtr)1; //這裡可以傳入一些自定義的資料,但只能是4位元組整數 cds.lpData = text; //訊息字串 cds.cbData = System.Text.Encoding.Default.GetBytes(text).Length + 1; //注意,這裡的長度是按位元組來算的 SendMessage(FindWindow(null, "接收端"), WM_COPYDATA, 0, ref cds); // 這裡要修改成接收視窗的標題“接收端” } } }
5,接收端exe原始碼
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.Tasks; using System.Windows.Forms; namespace Reserve { public partial class Form1 : Form { //WM_COPYDATA訊息所要求的資料結構 public struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } private const int WM_COPYDATA = 0x004A; //接收訊息方法 protected override void WndProc(ref System.Windows.Forms.Message e) { if (e.Msg == WM_COPYDATA) { CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct)); textBox1.Text = cds.lpData.ToString(); //將文字資訊顯示到文字框 //MessageBox.Show(cds.lpData); } base.WndProc(ref e); } public Form1() { InitializeComponent(); } private void button1_Click_1(object sender, EventArgs e) { } } }
6,原理:window提供了傳送訊息指令,0x004A,我們只需根據特定的函式和結構,傳送訊息,系統會自動找到另一個視窗名字的程序的視窗控制代碼,重寫該視窗的接收訊息函式,接收發送的訊息。