#define WM_MYCUSTOM (WM_USER + 1999)
WM_USER (0x0400) 以上為用戶自定義範圍,避免衝突。
class CMyDialog : public CDialog {
// ...
afx_msg void OnMyCustom(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_MESSAGE(WM_MYCUSTOM, OnMyCustom)
END_MESSAGE_MAP()
void CMyDialog::OnMyCustom(WPARAM wParam, LPARAM lParam) {
// wParam/lParam 攜帶自定義數據
// 處理邏輯...
}
// 非同步發送(推薦,不阻塞發送者)
pWnd->PostMessage(WM_MYCUSTOM, (WPARAM)pData, 0);
// 同步發送(需等待處理完成)
// pWnd->SendMessage(WM_MYCUSTOM, wParam, lParam);
| 特性 | PostMessage | SendMessage |
|---|---|---|
| 阻塞性 | 非阻塞,投遞隊列即返回 | 阻塞,直呼處理函數並等待返回 |
| 執行緒安全 | 跨執行緒安全 | 跨執行緒需謹慎(易死鎖) |
| 適用場景 | 通知、觸發、解耦 | 需即時結果、同步操作 |
wParam/lParam 傳 this 或結構體指標,接收端 reinterpret_cast 還原;WM_MYCUSTOM 定義,建議放公共頭文件;WM_APP 為基礎(WM_APP + x),範圍更寬;