• 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 造成的。哪位实现了知道一下

  • 相关阅读:
    CF 234 C Weather(粗暴方法)
    给工作赋予的新意义——Leo鉴书78
    获取集合的方法
    VS 统计代码行数
    , ,
    指针的删除动作
    C++ 名称空间
    boost::token_compress_on
    指针与引用
    容器的end()方法
  • 原文地址:https://www.cnblogs.com/kingteach/p/2051912.html
Copyright © 2020-2023  润新知