zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Manager Test and DAO
    07-图
    06-排序
    05-查找
    第04次作业-树
    第03次作业-栈和队列
    week-02 线性表
    week01—绪论
    使用promise封装el-form多个表单校验
    $slot受slot-scope影响,导致$slot中的key消失
  • 原文地址:https://www.cnblogs.com/dreamflycc/p/2982161.html
Copyright © 2011-2022 走看看