一、函數功能
該函數將指定的消息發送到一個或多個窗口。此函數爲指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數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/