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

Car*_*arl 2 c++ mfc

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

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

谢谢大家,

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

Jav*_*dro 6

我不确定这是否可行.我用它来为一些消息框创建子类,而不是阻止它们弹出,而且它们不是来自dll.

我在弹出之前设置了一个钩子来捕获消息框:

HHOK hMessageBoxHook_ = SetWindowsHookEx(WH_CBT, 
                                         &CbtHookProc, 
                                         ::GetModuleHandle(NULL), 
                                         GetCurrentThreadId());
Run Code Online (Sandbox Code Playgroud)

新的钩子程序(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); 
}
Run Code Online (Sandbox Code Playgroud)

从HCBT_CREATEWND的microsoft文档:

如果钩子过程返回非零值,则系统会销毁该窗口

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

            ::UnhookWindowsHookEx(hMessageBoxHook_);
            hMessageBoxHook_ = 0;
Run Code Online (Sandbox Code Playgroud)

正如我告诉你的那样,我不能保证它有效,但试一试.