WM_COPYDATA消息

     进程之间通讯的几种方法:

     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有

     1.使用内存映射文件

     2.通过共享内存DLL共享内存

     3.使用SendMessage向另一进程发送WM_COPYDATA消息

     比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.

     WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。

      这个函数的原型及其要用到的结构如下:

  SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
      其中,WM_COPYDATA对应的十六进制数为0x004A

       wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:
       typedef struct tagCOPYDATASTRUCT{
       DWORD dwData;//用户定义数据
       DWORD cbData;//数据大小
       PVOID lpData;//指向数据的指针
       }COPYDATASTRUCT;
      该结构用来定义用户数据。

     具体的接受消息处理消息的过程如下:

   

复制代码
#region 接收消息
        const int WM_COPYDATA = 0x004A;
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {//结构体
            public IntPtr dwData;//数据头标志,传递到接收方
            public int cbData;//数据,(字节)
            public IntPtr lpData;//数据指针传递给接收方应用程序
        }
        //自动接收消息 mystr.lpData;
        protected override void DefWndProc(ref Message m)
        {
            try
            {

                switch (m.Msg)
                {
                    //接收CopyData消息,读取发送过来的数据
                    case WM_COPYDATA:
                        COPYDATASTRUCT cds = new COPYDATASTRUCT();
                        Type mytype = cds.GetType();
                        cds = (COPYDATASTRUCT)m.GetLParam(mytype);//当前的消息
                        uint flag = (uint)(cds.dwData);
                        byte[] bt = new byte[cds.cbData];//注意,将结构体的成员单个处理再使用
                        Marshal.Copy(cds.lpData, bt, 0, bt.Length);//复制消息
                        if (cds.cbData > 0)
                        {
                             string tmp = System.Text.Encoding.Default.GetString(bt);//消息字符串
                             if (!string.IsNullOrEmpty(tmp))
                             {
                                 int index = Convert.ToInt32(flag);
                                 if (index == flagKHD)
                                 {
                                     getMessage(tmp);//对消息进行筛选使用
                                 }
                             }
                        }
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 接受到的消息  处理
        /// </summary>
        /// <param name="FormMsg"></param>
        protected void getMessage(string FormMsg)
        {
            string[] arrayInfor = FormMsg.Split(',');//将消息用逗号隔开
            //具体实用代码

        }
        #endregion
复制代码

 

posted @   dreamfly_cc  阅读(4783)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示