我有一个MFC应用程序(使用我无法更改的旧库)。应用程序启动时,如果无法加载某些驱动程序,它会加载一些驱动程序并显示消息框。驱动程序的加载和消息框的显示是通过库中无法更改的方法完成的(让我们调用此方法Init)。我想禁用这些消息框(防止它们“弹出”)。在调用Init暂时禁用消息框然后重新启用它之前,我可以调用一些东西吗?
(请注意,如果之后无法重新启用它们,我可以很好地使用它,我主要想禁用它们)
感谢所有人,
注意:如果有人想知道我为什么要这样做,那是因为我的应用程序公开了一个COM接口,并将被其他应用程序使用。它是应用程序的唯一原因是我使用的库在创建MFC应用程序(而不是dll)时更容易使用。当我的其他应用程序调用它时,我不希望显示消息框,我只是想在出现问题时得到错误。
答案 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
消息框来自不知道如何处理异常的框架。只需抓住它,按照自己的意愿去做。