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

VC++ 讓 MessageBox 顯示英文 Yes/No 按鈕:CBT Hook 技巧

     編輯:VC 教學

問題

MessageBox 按鈕文字跟隨系統語言 (中文版顯示「是/否」)。若需強制顯示英文 "Yes/No",不可直接修改資源,需攔截對話框建立過程。

解決方案:CBT Hook

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(),僅攔截當前執行緒,不影響其他執行緒/進程。

替代方案

  1. 自定義對話框類別:繼承 CDialog,資源編輯器直接改按鈕 Caption 為 "Yes/No",最徹底、無 Hook 風險。
  2. 系統語言包:安裝英文語言包並切換系統 UI 語言 (需重啟/登出)。
  3. MFC AfxMessageBox 重寫:覆寫 CWinApp::DoMessageBox 內建邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved