句柄關係圖解
hDlg1 = CreateDialog(hInst, MAKEINTRESOURCE(IDD_INDLG), hWnd, DialogProc);
// ↑ 返回值 ↑ 父窗口 ↑ 回調函數
BOOL CALLBACK DialogProc(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam)
// ↑ 系統傳入的當前對話框句柄
- hDlg1 == hDlg2:`CreateDialog` 返回的句柄,與回調函數參數 `hDlg2` 為同一對話框窗口句柄。
- hDlg3:代碼中未定義,若寫死為其他值則無效。
GetDlgItemText 失效常見原因
- 控件 ID 錯誤:資源文件中 `IDC_EDIT1` 與代碼不一致。
- 句柄錯誤:傳入 `hDlg3` 而非 `hDlg2`/`hDlg1`。
- 調用時機早:在 `WM_INITDIALOG` 之前調用,控件尚未創建。
- 緩衝區太小:第三參數 `str` 需足夠大(建議 `MAX_PATH` 或動態分配)。
正確調用模板
BOOL CALLBACK DialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) {
TCHAR buf[256];
// 使用回調參數 hDlg,即當前對話框句柄
int len = GetDlgItemText(hDlg, IDC_EDIT1, buf, _countof(buf));
if (len > 0) {
// 成功獲取文本
}
}
break;
}
return FALSE;
}
調試技巧
- 用 `Spy++` 確認控件 ID 與對話框句柄。
- 在 `GetDlgItemText` 返回 0 時調用 `GetLastError()` 獲取錯誤碼。