C# 两个exe传递消息

首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息。
接受方在DefWndProc事件中处理这条消息。由于中文编码是两个字节, 所以传递中文时候字节长度要搞清楚。
protected override void DefWndProc(ref  System.Windows.Forms.Message m)
{
    switch (m.Msg)
    {
    case WinMessageUtil.WM_COPYDATA:
        string str = WinMessageUtil.ReceiveMessage(ref m);
        break;
    default:
        break;
    }
    base.DefWndProc(ref  m);
}

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Speeding.Util
{
    //WM_COPYDATA消息所要求的数据结构
    public struct CopyDataStruct
    {
        public IntPtr dwData;
        public int cbData;

        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }

    /// <summary>
    /// 本类封装了一些进程间通讯的细节
    /// </summary>
    public class WinMessageUtil
    {
        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        // 第二个消息参数
            );

        /// <summary>
        /// 发送消息,只能传递一个自定义的消息ID和消息字符串,想传一个结构,但没成功
        /// </summary>
        /// <param name="destProcessName">目标进程名称,如果有多个,则给每个都发送 </param>
        /// <param name="msgID">自定义数据,可以通过这个来决定如何解析下面的strMsg </param>
        /// <param name="strMsg">传递的消息,是一个字符串 </param>
        public static void SendMessage(string destProcessName, int msgID, string strMsg)
        {
            if (strMsg == null)
                return;

            //按进程名称查找,同名称的进程可能有许多,所以返回的是一个数组
            Process[] foundProcess = Process.GetProcessesByName(destProcessName);
            foreach (Process p in foundProcess)
            {
                int toWindowHandler = p.MainWindowHandle.ToInt32();
                if (toWindowHandler != 0)
                {
                    CopyDataStruct cds;
                    cds.dwData = (IntPtr) msgID;  //这里可以传入一些自定义的数据,但只能是4字节整数     
                    cds.lpData = strMsg;            //消息字符串
                    cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;  //注意,这里的长度是按字节来算的

                    //发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了
                    int fromWindowHandler = 0;
                    SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref  cds);
                }
            }
        }

        /// <summary>
        /// 接收消息,得到消息字符串
        /// </summary>
        /// <param name="m">System.Windows.Forms.Message m </param>
        /// <returns>接收到的消息字符串 </returns>
        public static string ReceiveMessage(ref  System.Windows.Forms.Message m)
        {
            CopyDataStruct cds = (CopyDataStruct) m.GetLParam(typeof(CopyDataStruct));
            return cds.lpData;
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值