我有以下非託管C++代碼:如何禁用並啓用MessageBox中的重試按鈕?
MessageBox(NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);
我要禁用RETRY按鈕10秒(例如),那麼啓用它。
我該怎麼做?
我有以下非託管C++代碼:如何禁用並啓用MessageBox中的重試按鈕?
MessageBox(NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);
我要禁用RETRY按鈕10秒(例如),那麼啓用它。
我該怎麼做?
像@ffpf說,你需要使自己的對話框做到這一點,使用MFC,ATL,原Win32中,等
然後創建一個計時器,將啓用和禁用按鈕。
使用標準的MessageBox調用,你不能。你需要實現你自己的MessageBox才能做到這一點。
我不認爲這是可能的標準消息框調用。
您可能會更好地編寫包含此功能的自己的消息框。 (或者,你可以編寫一個單獨的線程,持續觀看等待消息框出現的屏幕,禁用重試按鈕,等待10秒鐘並重新啓用它,不好玩,嚴重的是,以其他方式做)。
由於Vista可以使用taskdialog - 比簡單的消息框更復雜的對話框。更多的信息和鏈接here。
您不能直接操縱MessageBox控件,但可以使用黑客。在顯示對話框並處理HCTIVATE事件之前安裝WH _
CBT掛鉤。這將爲您提供消息框的HWND,以便您可以隨心所欲地執行任何操作(對其進行子類化,管理其按鈕並設置定時器)。
您可以在James Brown的網站上找到帶有演示代碼的Custom MessageBox教程。
我同意efotinis,這是不可能的,一旦你有了HWND,你可以隨心所欲地做任何事情。這只是一個問題:「你真的需要黑客嗎?還是隻需創建自己的消息框對話框,你會更好?」
另一種不太好的方式找到HWND(這顯然會讓你訪問消息框中的eveything)將啓動一個線程並通過使用EnumChildWindows ciclically輪詢消息框句柄。但我個人更喜歡WH_CBT鉤子。
即使沒有Vista,任務對話框也比消息框更好。在Vista之前的系統中有一些實現可以使用,如果你不需要一次性使用所有的功能,那麼實現它也不難。 – OregonGhost 2008-10-06 20:47:02