使用純 Win32 API 建立視窗與按鈕,點擊按鈕時 WM_COMMAND 的 wParam 恆為 0,lParam 正確指向按鈕控制項控制代碼。
按鈕控制項建立時未指定 HMENU 參數(即控制項 ID)。CreateWindow 的第 10 參數 hMenu 在建立子視窗時作為控制項 ID 傳遞給父視窗。若傳 NULL,系統不會分配 ID,導致 WM_COMMAND 的 LOWORD(wParam)(控制項 ID)為 0。
#define ID_MY_BUTTON 1001
HWND hBtn = CreateWindow(
L"BUTTON", L"點我",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
10, 10, 100, 30,
hWnd, (HMENU)ID_MY_BUTTON, hInst, NULL);
接著在訊息迴圈中判斷:
case WM_COMMAND:
if (LOWORD(wParam) == ID_MY_BUTTON && HIWORD(wParam) == BN_CLICKED) {
// 按鈕被點擊
}
break;
使用 Spy++ 監控訊息,可清楚看到 WM_COMMAND 的完整參數結構,確認控制項 ID 是否正確傳遞。
MSDN: WM_COMMAND message