LRESULT SendMessage( HWND hWnd, // handle to destination window UINT Msg, // message WPARAM wParam, // first message parameter,消息的第一個參數 LPARAM lParam // second message parameter,消息的第二個參數, );
注意1:傳遞的到底是什么?是字符串,int數據,指針?
參數是一個數據,只能容納一個數,而不能是一長串數據。這個數可以是一個int數據,也可以是一個指針(指針本質上就是一個數據)。因此,若傳遞int,可以直接傳遞;若要傳遞字符串或者結構體變量,則只能將字符串或者結構體變量的指針賦予參數進行傳遞,而不是完整的字符串數據或者結構體變量。
注意2:兩個消息參數
WPARAM 和
lParam的區別 ?
wParam和lParam 這兩個是Win16系統遺留下來的產物,在Win16API中WndProc有兩個參數:
一個是WORD類型的16位
整型變量;另一個是LONG類型的32位整型變量。因此根據
匈牙利命名法,16位的變量就被命名為wParam, 32位的變量就被命名為lParam。到了Win32API中,原來的16位變量也被擴展為32位,因此此時wParam和lParam的大小完全相同。
實例:
實例一,發送char[]字符串
發送Message:
void CDlg2::OnBnClickedButton1() { // TODO: Add your control notification handler code here char s0[]="123456FEDBCA\r\n"; //需要傳遞的變量可以是此函數的局部變量也可以是工程的全局變量 // 通過第一個參數或者第二個參數傳遞都OK ::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s0); // OK // ::SendMessage(pMainFrame->pDlg4->m_hWnd ,UM_MESSAGE_EDIT_ADD_STRING,(WPARAM)&s0,0); // OK // 運用PostMessage 還未測試,據說不同,只能用全局變量,因為POST完之后不會等待消息處理完再進入下一步;而Send會 // 等待消息處理完之后再進行下一步,因此系統在這短時間內不會將本函數內的變量銷毀。本人會繼續驗證PostMessage的功能。 // ::PostMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s1); }
接收處理Message:
LRESULT CDlg4::OnMsgAddString(WPARAM wParam, LPARAM lParam) { int nMsgLen ; CString str; char *pStr0= (char *)wParam; // OK // char *pStr0= (char *)lParam; // OK str.Format(_T("%S"),pStr0); nMsgLen = m_Edit.GetWindowTextLength(); m_Edit.SetSel(nMsgLen, nMsgLen); m_Edit.ReplaceSel(*pStr1); return TRUE; }
實例二,發送CString字符串
發送Message:
void CDlg2::OnBnClickedButton1() { // TODO: Add your control notification handler code here CString s1=_T("123456\r\n"); // CString 本身是一個類,s1為其實例對象,因此傳遞的時候必須是這個對象的指針,而不是這個對象。依次類推,不僅可以傳遞字符串,還一個傳遞一個自定義的結構體對象或者一個其他類的對象。 //運用第一個參數傳遞,OK // ::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING,(WPARAM)&s1,0); //運用第二個參數傳遞,OK ::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0,(LPARAM)&s1); //OK //::PostMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s1); }
接收處理Message:
LRESULT CDlg4::OnMsgAddString(WPARAM wParam, LPARAM lParam) { int nMsgLen ; // 指針,非對象 CString *pStr1= (CString *)lParam; nMsgLen = m_Edit.GetWindowTextLength(); m_Edit.SetSel(nMsgLen, nMsgLen); m_Edit.ReplaceSel(*pStr1); return TRUE; }