sendmessage與postmessage的區別

一、函數功能

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

二、函數原型

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

參數:

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

Msg:指定被髮送的消息。

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

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

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

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

三、同一進程裏發送消息

1.發送消息


 

  CSendMessageDlg::OnBnClickeonSend()

 {

 CString* msg =  CString("");

 ::SendMessage(m_hWnd,WM_USER+1,0,(LPARAM)msg);

  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);

  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);

 

  (pOtherWnd)

 {

 COPYDATASTRUCT cpd;

 cpd.dwData = 0;

 cpd.cbData = strDataToSend.GetLength();

 cpd.lpData = (*)strDataToSend.GetBuffer(cpd.cbData);

 copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,

 (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),

 (LPARAM)&cpd);

 strDataToSend.ReleaseBuffer();

  

 

 }

  

 {

 AfxMessageBox("");

 }

(2)添加消息

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


 

 BEGIN_MESSAGE_MAP(CMyWnd, CWnd)

  

 ...

 ON_WM_COPYDATA()

 ...

  

 END_MESSAGE_MAP()

(3)消息處理


 

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

 {

 CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);

  CMyWnd::OnCopyData(pWnd, pCopyDataStruct);

 }

 


五、PostMessage  和SendMessage的區別

1.隊列

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

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

2.返回

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

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

 

六、引用申明

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章