程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 兩個獨立exe程序直接通信,

C# 兩個獨立exe程序直接通信,

編輯:C#入門知識

C# 兩個獨立exe程序直接通信,


兩個獨立的exe程序之間如何完成通信呢?首先想到的辦法是利用生成文件的方法,即,發送端在某個目錄下生

成一個文件,包含要發送的消息,接收端從這個目錄中讀取文件且獲取消息。這個方法也能實現通信,但是總感覺有

點多此一舉。能不能讓兩個exe程序直接進行通信,發送消息呢?

答案是肯定的!而且還有好幾種方法。1 發送消息傳遞 2 共享內存傳遞 3 使用COM進程外服務器 ...

這篇文章主要說明一下,如何利用發送消息使兩個exe完成通信。其他兩個方法感興趣可以搜索下,都可以找到相應

的demo,這裡就不再另加說明了。

這次的demo分為兩個部分,發送端和接收端。顧名思義分別負責發送消息和接收消息。

添加這兩個窗體

發送端代碼:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //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(); }

接收端代碼:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //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函數發送消息給接收端,這樣就完成了程序的直接通信。

其他辦法也可實現,歡迎交流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved