本文是對MSDN中關於SendMessage的翻譯與小結。
SendMessage函數功能描述:將指定的消息發送到一個或多個窗口。此函數為指 定的窗口調用窗口過程,直到窗口過程處理完消息後才返回。
.函數原型:
LRESULT SendMessage(
HWND hWnd, // 目標窗口句柄
UINT Msg, // 被發送的消息
WPARAM wParam, // 第一個消息參數
LPARAM lParam // 第二個消息參數
);
.參數:
hWnd
窗口過程接收消息的窗口句柄。如果此參數為HWND_BROADCAST,則消息被送到 系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和 彈出式窗口。消息不被送到子窗口。
Msg
指定被發送的消息;
wParam
指定附加消息的特定信息;
lParam
指定附加消息的特定信息。
.返回值:
返回值返回消息處理的結果,其依賴於所發送的消息。
.備注:
需要以 HWND_BROADCAST 方式通信的應用程序應該使用 RegisterWindowMessage 函數來獲得應用程序間通信的獨特消息。
如果指定的窗口通過調用線程被創建,則窗口過程作為子程序被立即調用。如 果指定的窗口通過調用不同線程被創建,則系統切換到該線程並調用適當的窗口 過程。線程間的消息只有在接收線程執行消息檢索代碼時才被處理。發送線程將 被阻塞到接收線程處理完消息為止。
Windows CE:Windows CE不支持Windows桌面平台所支持的所有消息。在使用 SendMessage函數之前,應檢查發送的消息是否被Windows CE所支持。
.使用環境:
Windows NT: 3.1及以上版本;
Windows:95及以上版本;
Windows CE:1.0及以上版本;
頭文件:winuser.h;
輸入庫:user32.lib;
Unicode:在WindowsNT(Windows2000)環境下以Unicode和ANSI方式實現。
.示例代碼:
case WM_KEYDOWN:
switch (wParam)
{
case VK_HOME:
SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
break ;
case VK_END:
SendMessage (hwnd, WM_VSCROLL, SB_BOTTOM, 0) ;
break ;
case VK_PRIOR:
SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0) ;
break ;
...
}
return 0 ;
...
.常見問題
1)使用SendMessage來實現剪切、復制和粘貼
SendMessage(hwnd, WM_COPY, 0, 0);
2)SendMessage與PostMessage的 區別
SendMessage(hwnd, WM_CUT, 0, 0);
SendMessage(hwnd, WM_PASTE, 0, 0);
PostMessage將消息放入消息隊列後馬上返回,而SendMessage直到窗口過程處 理完消息後才返回
3)SendMessage發送WM_COPYDATA消息在進程間傳送數據
WM_COPYDATA消息主要目的是允許在進程間傳遞少量只讀數據。SDK文檔推薦用 戶使用SendMessage()函數,接收方在數據復制完成前不返回,這樣發送方就不可 能刪除和修改數據。
例如:
std:string strData = "VC知識庫 VCKBASE.COM";
(全文完 )
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = strData.Length();
cds.lpData = strData.c_str();
::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cds);