2013-06-03 70 views
-7

我想顯示一個簡單的是/否消息框,但灰色/不活動「否」按鈕。隨着C win32api顯示是/否消息框,其中否爲灰色顯示win32api C++

+3

你能解釋的是,用戶可以」點擊?如果只有一個選擇,沒有理由顯示消息框...... –

+0

因爲它可以是滑稽的給出問題的上下文 – y2k

+0

[This project](http://www.codeproject.com/Articles/18399/Localizing -System-MessageBox)掛鉤消息框以更改按鈕文本。你可以很容易地擴展它來禁用按鈕。 – arx

回答

4

使用SetWindowsHookEx()SetWinEventHook()與線程局部鉤子捕獲MessageBox()對話框的HWND,那麼你可以使用EnableWindow()禁用按鈕。

下面是一個使用SetWindowsHookEx()如何做到這一點:

HHOOK hHook = NULL; 

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if(nCode == HCBT_ACTIVATE) 
    { 
     HWND hDlg = (HWND) wParam; 
     HWND hBtnWnd = GetDlgItem(hDlg, IDNO); 
     if (hBtnWnd != NULL) 
      EnableWindow(hBtnWnd, FALSE); 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

{ 
    //... 

    hHook = SetWindowsHookEx(WH_CBT, &CBTProc, NULL, GetCurrentThreadId()); 

    MessageBox(NULL, TEXT("Test"), TEXT("Test"), MB_YESNO); 

    if (hHook != NULL) 
     UnhookWindowsHookEx(hHook); 

    //... 
} 

這裏是如何做到這一點使用SetWinEventHook():爲什麼你要顯示的選項

void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    if(event == EVENT_SYSTEM_DIALOGSTART) 
    { 
     HWND hBtnWnd = GetDlgItem(hwnd, IDNO); 
     if (hBtnWnd != NULL) 
      EnableWindow(hBtnWnd, FALSE); 
    } 
} 

{ 
    //... 

    HRESULT hRes = CoInitialize(NULL); 

    HWINEVENTHOOK hHook = SetWinEventHook(EVENT_SYSTEM_DIALOGSTART, EVENT_SYSTEM_DIALOGSTART, NULL, &WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT); 

    MessageBox(NULL, TEXT("Test"), TEXT("Test"), MB_YESNO); 

    if (hHook != NULL) 
     UnhookWinEvent(hHook); 

    if (SUCCEEDED(hRes)) 
     CoUninitialize(); 

    //... 
} 
+0

幸運的是,當您擁有XMessageBox時,您不必從頭開始編寫自己的消息框。 – StilesCrisis

+0

@StilesCrisis,爲什麼添加對外部代碼的依賴關係,只需創建一個帶有兩個按鈕和一些文本的對話框就足夠簡單了? –

+0

夠公平的。我在一個已經有XMessageBox的項目中工作,我們用它來處理所有事情,所以我猜想我的思維傾向於這個方向。這對你的工具箱來說確實是一件好事,但如果你不需要它用於任何其他目的,當然,這是過度的。 – StilesCrisis