程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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分為兩個部分,發送端和接收端。顧名思義分別負責發送消息和接收消息。

添加這兩個窗體

發送端代碼:

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

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

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