進程通訊1----WM_COPYDATA消息和自定義消息

使用粘剪板即在線程之間發送WM_COPYDATA消息,前提是:

 1,知道接收消息進程的句柄。        

 2,接收消息進程重載了WM_COPYDATA消息映射,能對其做出反應(否則不是發送端自作多情了?)  

獲得句柄的方法,最簡單的方法就是使用FindWindow,找窗口類名,或者標題名,如果你覺得這樣不把握,那就利用SetProp給窗口做個記號。        

發送端代碼:        

 HWND   hWnd   =   FindWindow(NULL,"MyApp");        

if(hWnd!=NULL)     

{   

      HANDLE hTemp = GetProp(hWnd,"abc");

      if (hTemp  == HANDLE(1))//光憑窗口名不夠,可能會有很多同名窗口,而且不屬於一個應用程序,所以加一個                                                 //判斷標記

      {

                COPYDATASTRUCT   cpd;   /*給COPYDATASTRUCT結構賦值*/                   

               cpd.dwData   =   0;                   

              cpd.cbData   =   strlen("字符串");                   

               cpd.lpData   =   (void*)"字符串";                   

               ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//發送!  

      }          

 }  

接收端:

  先設立一個標記

  SetProp(m_hWnd,"abc",(HANDLE)1);

  然後響應WM_COPYDATA消息

   BOOL CwefsdfDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

{    

 // TODO: 在此添加消息處理程序代碼和/或調用默認值     

 AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));      

return CDialog::OnCopyData(pWnd, pCopyDataStruct);

}

其他包括標準window消息,命令消息,控件消息都無法跨進程發送,但是自定義消息可以

1.在接收端和發送端都自定義一個消息#define WM_COMM WM_USER+100

2.接收端映射消息:ON_MESSAGE(WM_COMM,OnUserReceiveMsg)

3.在發送端找到接收窗口,向接收窗口發送一個WM_COMM消息

粘剪板和自定義消息只能發送只讀數據,接收端不能發送端的任何數據,只能讀取發送過來的數據。

 

發佈了44 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章