2011-06-29 43 views
2

我有一個MFC應用程序(使用我無法更改的遺留庫)。當應用程序啓動時,如果某些驅動程序無法加載,它將加載幾個驅動程序並顯示消息框。驅動程序的加載和消息框的顯示是通過庫中不能更改的方法完成的(我們稱之爲Init方法)。我想禁用這些消息框(防止它們「彈出」)。在調用Init暫時禁用消息框然後重新啓用它們之前,有什麼我可以調用的嗎?有沒有辦法在MFC中禁用消息框?

(請注意,如果這是不可能完成後重新打開它們,我可以很好地與生活,我主要是想禁用它們)

感謝所有,

注:如果有人想知道關於爲什麼我想這樣做,這是因爲我的應用程序公開了一個COM接口並將被其他應用程序使用。它是一個應用程序的唯一原因是我使用的庫在創建MFC應用程序(而不是dll)時更容易使用。當我的其他應用程序調用它時,我不希望顯示消息框,如果出現錯誤,我只想獲取錯誤。

回答

6

我不確定這是否可行。我使用它來爲子類化一些消息框,而不是阻止它們彈出並且它們不是來自dll。

我設置一個鉤子坡平了之前捕捉到消息框:

HHOK hMessageBoxHook_ = SetWindowsHookEx(WH_CBT, 
             &CbtHookProc, 
             ::GetModuleHandle(NULL), 
             GetCurrentThreadId()); 

新的鉤子程序(CbtHookProc)會是這樣的:

LRESULT CALLBACK CbtHookProc( int nCode, 
              WPARAM wParam, 
              LPARAM lParam) 
{ 
    if(nCode < 0) 
    { 
     return ::CallNextHookEx( hMessageBoxHook_, 
            nCode, 
            wParam, 
            lParam); 
    } 

    switch(nCode) 
    { 
     case HCBT_CREATEWND: // a window is about to be created 
      return -1; 
    } 

    return ::CallNextHookEx( hMessageBoxHook_, 
           nCode, 
           wParam, 
           lParam); 
} 

microsoft documentation爲HCBT_CREATEWND:

如果掛鉤程序返回非零值 ,則系統銷燬 窗口

然後調用初始化,您可以刪除掛鉤和消息框將再次彈出後:

  ::UnhookWindowsHookEx(hMessageBoxHook_); 
      hMessageBoxHook_ = 0; 

正如我告訴你,我不能保證它的工作原理,但不妨一試。

+0

這工作完美!非常感謝你:) – Carl

+0

很高興知道它的工作原理!別客氣! –

0

我在MFC中使用ODBC時遇到了同樣的問題。每次出現錯誤時,都會彈出一個消息框,顯示錯誤,如果我想要的話就沒問題。

不過,如果我沒有,我只需要與將其包圍:

TRY 
{ 
    // Call error-prone method 
} 
CATCH (CException, pEx) 
{ 
    // Free resources 
} 
END_CATCH 

消息框來自於框架不知道如何處理異常。只需抓住它並按照你的意願去做就可以了。

+0

感謝您的幫助,但是這並沒有解決我的問題。該消息框不是來自未處理的異常,他們來自本身捕獲錯誤,並顯示消息框庫。如果有可能,我想禁用或隱藏任何未來的消息框,使圖書館無法顯示它們。 – Carl

1

做到這一點的一種方法是掛鉤/解除對MessageBox/MessageBoxEx /等的呼叫。當這些電話發出時,什麼也不做。查詢this guide瞭解有關掛鉤API調用的詳細信息。在你的情況下,我會專門研究Import Address Table方法,這很容易實現,並允許你實現你想要的功能。

您可能還需要檢查微軟自己Detours庫,但我不知道它是否支持替換API調用功能。

希望它有幫助。

相關問題