C# Winform -----通过copydata实现两个Form进程间通信

winform 在两个form窗口间实现进程通信
1.首先在建立两个项目 一个form作为发送方 name:Sender ,一个form作为接受方 name:Receiver
C# Winform -----通过copydata实现两个Form进程间通信## 接收方
1.布局
C# Winform -----通过copydata实现两个Form进程间通信TextBox控件 name:textBox1
发送按钮控件 name:Send_But
2.代码

public partial class Sender : Form
    {
        //发送消息
        public Sender()
        {
            InitializeComponent();
            
        }

        //消息标识
        //WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。
        public const int WM_COPYDATA = 0x004A;

        //COPYDATASTRUCT 结构  
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;  
            public int cData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        //系统SendMessage方法  SendMessage为阻塞方法
        [DllImport("User32.dll",EntryPoint = "SendMessage")]
        public static extern int SendMessage(//系统级的函数
            int hwnd,  // handle to destination window
            int msg,  // message
            int wParam, // first message parameter
            ref COPYDATASTRUCT IParam);


        [DllImport("User32.dll",EntryPoint = "FindWindow")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

       
        //自己封装的方法
        public int Send_message(int handle,string message) {
            byte[] arr = System.Text.Encoding.Default.GetBytes(message);
            int len = arr.Length;
            COPYDATASTRUCT cdata;//打开结构体
            cdata.dwData = (IntPtr)100;//对结构体赋值
            cdata.lpData = message;//对结构体赋值
            cdata.cData = len + 1;//对结构体赋值
            return SendMessage(handle, WM_COPYDATA, 0, ref cdata);//调用SendMessage
        }
        private void Send_But_Click(object sender, EventArgs e)
        {

            int Form_HANDLE = FindWindow(null, "Receiver");//拿到接受方窗体的句柄

            if (Form_HANDLE != 0)
            {
                int ret = Send_message(Form_HANDLE, this.textBox1.Text);
            }


        }

       
    }

接收方

接收方使用label控件作为发送方数据的显示控件 name:label1
C# Winform -----通过copydata实现两个Form进程间通信代码

public partial class Receiver : Form
    {
        
        public Receiver()
        {
            InitializeComponent();
        }

        
        //COPYDATASTRUCT结构
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        public const int WM_COPYDATA = 0x004A;

        
        //捕获消息
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:
                    //处理消息
                    COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                    Type mytype  = mystr.GetType();
                    mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
                    string content= mystr.lpData;
                    label1.Text = content;
                    break;
                default:
                    break;
            }

            base.WndProc(ref m);
        }


    }

效果

C# Winform -----通过copydata实现两个Form进程间通信总结:
可将两个共有部分提取 分装成一个帮助类方法