首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

SendMessage 函數深度解析:原型、參數、同步機制與常見應用

     編輯:關於VC++

函數原型與參數

LRESULT SendMessage(
    HWND hWnd,      // 目標視窗控制代碼
    UINT Msg,       // 訊息編號
    WPARAM wParam,  // 第一參數
    LPARAM lParam   // 第二參數
);

hWnd 特殊值

  • HWND_BROADCAST:廣播至所有頂層視窗 (含不可見、擁有者視窗、彈出視窗),不包含子視窗
  • 廣播建議使用 RegisterWindowMessage 取得唯一訊息編號避免衝突

同步阻塞機制

  • 目標視窗屬於**呼叫執行緒**:視窗程序**同步直接呼叫** (子程序方式)
  • 目標視窗屬於**其他執行緒**:系統切換至該執行緒並呼叫視窗程序,**呼叫執行緒阻塞**直到處理完成
  • 執行緒間訊息僅在接收執行緒執行訊息檢索迴圈時處理

返回值

視窗程序處理結果,具體含義取決於訊息類型。

適用環境

  • Windows NT 3.1+ / Windows 95+ / Windows CE 1.0+
  • 標頭檔:winuser.h,匯入庫:user32.lib
  • Unicode/ANSI 皆支援 (NT/2000)

常見應用範例

1. 捲動控制 (WM_VSCROLL)

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;

2. 編輯控制項剪貼簿操作

SendMessage(hwnd, WM_COPY, 0, 0);
SendMessage(hwnd, WM_CUT, 0, 0);
SendMessage(hwnd, WM_PASTE, 0, 0);

3. WM_COPYDATA 跨進程傳遞資料

推薦使用 SendMessage (同步),確保接收方複製完成前不返回,避免發送方過早修改/釋放資料:

std::string strData = "VC知識庫 VCKBASE.COM";
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = strData.length();
cds.lpData = (void*)strData.c_str();
::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cds);

SendMessage vs PostMessage

特性SendMessagePostMessage
機制同步,直接呼叫視窗程序非同步,放入訊息隊列
返回時機處理完成後放入隊列後立即
阻塞呼叫端是否
適用場景需即時結果、跨進程資料傳遞通知、非阻塞觸發

Windows CE 注意事項

不支援所有桌面平台訊息,使用前需確認目標平台支援性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved