2011-06-29 45 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调用功能。

希望它有帮助。

相关问题