1. 程式人生 > >兩個winform.exe程式之間的通訊一————————傳送訊息

兩個winform.exe程式之間的通訊一————————傳送訊息

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,我們只需根據特定的函式和結構,傳送訊息,系統會自動找到另一個視窗名字的程序的視窗控制代碼,重寫該視窗的接收訊息函式,接收發送的訊息。