有没有办法在MFC中禁用消息框?

时间:2011-06-29 14:19:22

标签: c++ mfc

我有一个MFC应用程序(使用我无法更改的旧库)。应用程序启动时,如果无法加载某些驱动程序,它会加载一些驱动程序并显示消息框。驱动程序的加载和消息框的显示是通过库中无法更改的方法完成的(让我们调用此方法Init)。我想禁用这些消息框(防止它们“弹出”)。在调用Init暂时禁用消息框然后重新启用它之前,我可以调用一些东西吗?

(请注意,如果之后无法重新启用它们,我可以很好地使用它,我主要想禁用它们)

感谢所有人,

注意:如果有人想知道我为什么要这样做,那是因为我的应用程序公开了一个COM接口,并将被其他应用程序使用。它是应用程序的唯一原因是我使用的库在创建MFC应用程序(而不是dll)时更容易使用。当我的其他应用程序调用它时,我不希望显示消息框,我只是想在出现问题时得到错误。

3 个答案:

答案 0 :(得分: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:

  

如果钩子程序返回一个   非零值,系统破坏了   窗口

然后在调用Init后你可以删除钩子并再次弹出消息框:

            ::UnhookWindowsHookEx(hMessageBoxHook_);
            hMessageBoxHook_ = 0;

正如我告诉你的那样,我无法保证它有效,但试一试。

答案 1 :(得分:1)

执行此操作的一种方法是挂钩/取消挂接MessageBox / MessageBoxEx /等的呼叫。这些调用完成后什么也不做。有关挂钩API调用的详细信息,请查看this guide。在您的情况下,我将特别关注Import Address Table方法,该方法非常易于实现,并允许您实现所需的功能。

您可能还想检查Microsoft自己的Detours库,但我不确定它是否支持替换API调用功能。

希望它有所帮助。

答案 2 :(得分:0)

将ODBC与MFC一起使用时遇到了同样的问题。每次出现错误时,都会弹出一个消息框,显示错误,如果我需要的话,这很好。

然而,如果我没有,我只需要用:

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

消息框来自不知道如何处理异常的框架。只需抓住它,按照自己的意愿去做。

相关问题