兩個獨立的exe程序之間如何完成通信呢?首先想到的辦法是利用生成文件的方法,即,發送端在某個目錄下生
成一個文件,包含要發送的消息,接收端從這個目錄中讀取文件且獲取消息。這個方法也能實現通信,但是總感覺有
點多此一舉。能不能讓兩個exe程序直接進行通信,發送消息呢?
答案是肯定的!而且還有好幾種方法。1 發送消息傳遞 2 共享內存傳遞 3 使用COM進程外服務器 ...
這篇文章主要說明一下,如何利用發送消息使兩個exe完成通信。其他兩個方法感興趣可以搜索下,都可以找到相應
的demo,這裡就不再另加說明了。
這次的demo分為兩個部分,發送端和接收端。顧名思義分別負責發送消息和接收消息。
添加這兩個窗體
發送端代碼:
//WM_COPYDATA消息所要求的數據結構 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 strURL = txtImpinj.Text; CopyDataStruct cds; cds.dwData = (IntPtr)1; //這裡可以傳入一些自定義的數據,但只能是4字節整數 cds.lpData = strURL; //消息字符串 cds.cbData = System.Text.Encoding.Default.GetBytes(strURL).Length + 1; //注意,這裡的長度是按字節來算的 SendMessage(FindWindow(null, "接收端"), WM_COPYDATA, 0, ref cds); // 這裡要修改成接收窗口的標題“接收端” //this.Close(); }
接收端代碼:
//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); }
編譯後,找到目錄:~\bin\Debug下的exe文件運行。效果為:
上面代碼只是個demo為了說明問題,經常使用的話我們可以將這些方法封裝到一個類裡面,方便復用。
總的來說,這種方法的原理就是,利用FindWindow函數通過窗體標題查找出對方的進程,然後取得窗口
Handle,再通過DLL庫中的SendMessage函數發送消息給接收端,這樣就完成了程序的直接通信。
其他辦法也可實現,歡迎交流。