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函數發送消息給接收端,這樣就完成了程序的直接通信。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM