当前位置:编程学习 > C#/ASP.NET >>

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; 

        } 

 

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,