C# 不同进程间消息传递

不同进程的消息传递方式:

1、不同窗口间消息传递函数SendMessage、PostMessage:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace sendMsg
{
    public partial class Form1 : Form
    {
        public struct MsgStruct
        {
            public IntPtr dwData;
            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;
        }

        public const int WM_COPYDATA = 0x004A;  //"0x004A"是Win32在应用程序之间传递消息的指令

        //通过窗口的标题来查找窗口的句柄 
        [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 MsgStruct lParam        // 第二个消息参数
         );


        //封装的发送消息函数,这里发送的是字符串,也可以选择其他数据类型
        private void SendMsg(int hwnd, string sendString)
        {
            MsgStruct mss;
            mss.dwData = this.Handle;   //这里可以传入本窗口句柄,或其他数字,但只能是4字节整数    
            mss.lpData = sendString;    //消息字符串
            mss.cbData = System.Text.Encoding.Default.GetBytes(sendString).Length + 1;  // //数据长度,按字节计算
            SendMessage(hwnd, WM_COPYDATA, 0, ref mss);  //发送的第一个消息参数可以自己定义,这个为0
        }

        //接收消息后调用的方法
        protected override void WndProc(ref System.Windows.Forms.Message e)
        {
            if (e.Msg == WM_COPYDATA)
            {
                int wd = (int)e.WParam; //获取第一个参数

                MsgStruct mss = (MsgStruct)e.GetLParam(typeof(MsgStruct));  //获取第二个参数
                textBox1.Text = mss.lpData;  //将文本信息显示到文本框

                //这里反馈已收到消息,只能选择一个窗口反馈,两个窗口都反馈会进入死循环
                //SendMsg((int)mss.dwData, "消息已收到!");
            }
            base.WndProc(ref e);
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void sendBtn_Click(object sender, EventArgs e)
        {
            int hwnd = FindWindow(null, "Form2");
            if (hwnd > 0)
            {
                SendMsg((int)hwnd, textBox2.Text);
            }
            else
            {
                MessageBox.Show("没有找到窗口“Form2”!");
            }
        }


    }
}

2、共享内存

3、TCP/IP通讯

发布了15 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yxt99/article/details/105740609
今日推荐