[VC]SendMessage和PostMessage發送消息(不同進程傳遞字符串)

一、函數功能

該函數將指定的消息發送到一個或多個窗口。此函數爲指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列後立即返回。

二、函數原型

SendMessage函數的原型爲 
LRESULT SendMessage( 
  HWND hWnd, 
  UINT Msg, 
  WPARAM wParam, 
  LPARAM lParam 
);

參數:

hWnd:其窗口程序將接收消息的窗口的句柄。

Msg:指定被髮送的消息。

wParam:指定附加的消息指定信息。

IParam:指定附加的消息指定信息。

返回值:返回值指定消息處理的結果,依賴於所發送的消息

WPARAM 和 LPARAM 兩個附加參數,可以傳遞一些附加信息,由於它們是long 型的,所以只能傳遞數字,如果想要傳遞字符串之類的則需要使用指針,即字符串的地址。

三、同一進程裏發送消息

1.發送消息

void CSendMessageDlg::OnBnClickedButtonSend()
{
 CString* msg = new CString("發送的字符串");
 ::SendMessage(m_hWnd,WM_USER+1,0,(LPARAM)msg);
 delete msg; 
}

2.添加消息響應函數

(1)SendMessageDlg.h 添加

afx_msg HRESULT OnClickBtn1(WPARAM,LPARAM);

(2)SendMessageDlg.cpp

BEGIN_MESSAGE_MAP

END_MESSAGE_MAP()中間

ON_MESSAGE(WM_USER+1,OnClickBtnSend)   

(3)實現函數

HRESULT CSendMessageDlg::OnClickBtn1(WPARAM wParam,LPARAM lParam)
  {
   CString* rmsg = (CString*)lParam;
   MessageBox(*rmsg);
   return TRUE;
  }

3.點擊發送,響應消息

四、不同進程發送消息傳遞字符串

1.兩個進程間

(1)兩個不同的進程不能用上面的方法,當然只發送消息是可以的。

(2)兩個進程由於使用的是相互獨立的兩個虛擬內存空間,同一地址對不同的進程來說並不一定指向同一物理內存,內容也就不一定一樣,因此不同進程無法通過傳地址的方式傳遞字符串(但是同一進程下的不同線程是可以的)

2.解決辦法

發送WM_COPYDATA消息在進程間傳送數據

(1)發送消息

The exchange of data is performed by finding the other application (using FindWindow) and sending a WM_COPYDATA message to that window

使用FindWindow找到窗口,然後發送WM_COPYDATA消息,字符串附加到COPYDATASTRUCT 結構體

  LRESULT copyDataResult;
  CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle);
  if (pOtherWnd)
  {
    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = strDataToSend.GetLength();
    cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
    copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
                                                (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
                                                (LPARAM)&cpd);
    strDataToSend.ReleaseBuffer();
    // copyDataResult has value returned by other app
    
  } 
  else 
  {
    AfxMessageBox("Unable to find other app.");
  }

(2)添加消息

The other app should handle the WM_COPYDATA message in the following manner

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
  //{{AFX_MSG_MAP(CMyWnd)
  ...
  ON_WM_COPYDATA()
  ...
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

(3)消息處理

BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
  CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
  return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}


五、PostMessage  和SendMessage的區別

1.隊列

PostMessage  和SendMessage的區別主要在於是否等待其他程序消息處理。

PostMessage只是把消息放入隊列,不管其他程序是否處理都返回,然後繼續執行

2.返回

SendMessage必須等待其他程序處理消息後才返回,繼續執行。這兩個函數的返回值也不同,SendMessage的返回值表示其他程序處理消息後的返回值

PostMessage的返回值表示PostMessage函數執行是否正確

 

六、引用申明

引用到csdn還有codeproject上的部分代碼和部分話語,具體鏈接也存檔後忘記了,謝謝作者。

我自己的內容歡迎隨便修改轉載使用。

本人出處:http://pppboy.blog.163.com/blog/static/3020379620101026103644889/
發佈了2 篇原創文章 · 獲贊 68 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章