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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM