我有一个MFC应用程序(使用我无法更改的旧库).应用程序启动时,如果无法加载某些驱动程序,它会加载一些驱动程序并显示消息框.驱动程序的加载和消息框的显示是通过库中无法更改的方法完成的(让我们调用此方法Init).我想禁用这些消息框(防止它们"弹出").在调用Init暂时禁用消息框然后重新启用它之前,我可以调用一些东西吗?
(请注意,如果之后无法重新启用它们,我可以很好地使用它,我主要想禁用它们)
谢谢大家,
注意:如果有人想知道我为什么要这样做,那是因为我的应用程序公开了一个COM接口,并将被其他应用程序使用.它是应用程序的唯一原因是我使用的库在创建MFC应用程序(而不是dll)时更容易使用.当我的其他应用程序调用它时,我不希望显示消息框,我只是想在出现问题时获取错误.
我不确定这是否可行.我用它来为一些消息框创建子类,而不是阻止它们弹出,而且它们不是来自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)
正如我告诉你的那样,我不能保证它有效,但试一试.
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |