c# 自定义消息 进程间通信

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

using System.Diagnostics;



namespace TopInfo.Metevation.Common

{

    //WM_COPYDATA消息所要求的数据结构

    public struct CopyDataStruct

    {

        public IntPtr dwData;

        public int cbData;



        [MarshalAs(UnmanagedType.LPStr)]

        public string lpData;

    }



    /// 本类封装了一些进程间通讯的细节

    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        // 第二个消息参数

            );



        /// 发送消息,只能传递一个自定义的消息ID和消息字符串,想传一个结构,但没成功

        /// 目标进程名称,如果有多个,则给每个都发送

        /// 自定义数据,可以通过这个来决定如何解析下面的strMsg

        /// 传递的消息,是一个字符串

        public static void SendMessage(int toWndHandler, string strMsg)

        {

            string s = toWndHandler.ToString();

            if (strMsg == null) return;



            int toWindowHandler = FindWindow(null, "置顶自动观测站服务");//获取目标窗口句柄方法一



            //获取目标窗口句柄方法二

            //Process[] foundProcess = Process.GetProcessesByName("TopInfo.Metevation.Controller.Services.exe");

            //foreach (Process p in foundProcess)

            //{

            //    toWndHandler = p.MainWindowHandle.ToInt32();

            //}



            // SystemEventLog.Log.WriteEntry(s + "获得句柄aaa" + toWndHandler);



            CopyDataStruct cds;

            cds.dwData = (IntPtr)100;   //这里可以传入一些自定义的数据,但只能是4字节整数      

            cds.lpData = strMsg;            //消息字符串

            cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;  //注意,这里的长度是按字节来算的



            //发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了

            int fromWindowHandler = 0;

            SendMessage(toWndHandler, WM_COPYDATA, fromWindowHandler, ref  cds);

        }



        /// 接收消息,得到消息字符串

        /// System.Windows.Forms.Message m

        /// 接收到的消息字符串

        public static string ReceiveMessage(ref  System.Windows.Forms.Message m)

        {

            CopyDataStruct cds = (CopyDataStruct)m.GetLParam(typeof(CopyDataStruct));

            return cds.lpData;

        }

    }

}

接受消息:

  protected override void DefWndProc(ref System.Windows.Forms.Message m)

        {

            switch (m.Msg)

            {

                case WINMessageUtil.WM_COPYDATA:

                    string msg = WINMessageUtil.ReceiveMessage(ref m);

                    PrintMessage(msg);

                    break;

                default:

                    base.DefWndProc(ref m);

                    break;

            }

        }

 

 在win7 下,服务向应用程序发送消息不成功,估计是win7 下Session0 造成的。哪位实现了知道一下

你可能感兴趣的:(自定义)