MessageBox 按鈕文字跟隨系統語言 (中文版顯示「是/否」)。若需強制顯示英文 "Yes/No",不可直接修改資源,需攔截對話框建立過程。
WH_CBT (Computer-Based Training) Hook 在視窗建立/啟動前回呼,可修改子控件文字。
#include
HHOOK g_hHook = NULL;
LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_ACTIVATE) {
HWND hDlg = (HWND)wParam;
// 修改按鈕文字 (IDYES=6, IDNO=7)
SetDlgItemText(hDlg, IDYES, _T("&Yes"));
SetDlgItemText(hDlg, IDNO, _T("&No"));
UnhookWindowsHookEx(g_hHook); // 僅攔截一次
g_hHook = NULL;
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
g_hHook = SetWindowsHookEx(WH_CBT, CbtHookProc, hInst, GetCurrentThreadId());
if (g_hHook) {
MessageBox(NULL, _T("Are you sure?"), _T("Confirm"), MB_ICONQUESTION | MB_YESNO);
}
else {
MessageBox(NULL, _T("Hook failed"), _T("Error"), MB_ICONERROR);
}
return 0;
}
HCBT_ACTIVATE:對話框即將顯示,子控件已建立,可安全修改。SetDlgItemText:直接修改按鈕控件文字,支援 & 定義熱鍵 (Alt+Y / Alt+N)。UnhookWindowsHookEx:立即卸載 Hook,避免影響後續對話框。SetWindowsHookEx 最後參數傳 GetCurrentThreadId(),僅攔截當前執行緒,不影響其他執行緒/進程。CDialog,資源編輯器直接改按鈕 Caption 為 "Yes/No",最徹底、無 Hook 風險。AfxMessageBox 重寫:覆寫 CWinApp::DoMessageBox 內建邏輯。