消息框不显示
Posted
技术标签:
【中文标题】消息框不显示【英文标题】:MessageBox not being displayed 【发布时间】:2018-11-24 15:19:44 【问题描述】:当试图显示一个简单的 MessageBox 时,它根本不显示。
代码:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow )
try
Window wnd( 50, 50 , Graphics::ScreenWidth, Graphics::ScreenHeight, "Bat Engine", Graphics::FullScreen );
throw std::exception( "test" );
catch( const std::exception& e )
MessageBox( NULL, e.what(), "Error", MB_ICONWARNING | MB_OK );
return 0;
MessageBox
的返回值是IDOK
,这应该意味着我单击了“确定”按钮,尽管事实并非如此。 GetLastError 也不返回任何错误。
此外,只有在初始化 Window 后抛出异常时才会发生这种情况。 Window 类可以在这里找到:https://github.com/SlidyBat/BatEngine/blob/2a1427265d359949a6f3f5a160d553990656354e/Engine/Window.cpp
在网上搜索了这个问题后,我找到了这个答案:https://***.com/a/41171505/9094644
如果我在显示消息框 (like this) 之前清除消息队列就可以了。清除队列中的消息是 WM_QUIT、WM_TIMER 和 ID 为 1847 的消息(不确定那是什么)。
现在我只是在显示消息框之前清除消息队列以确保它正常工作,但如果能找出我到底做错了什么导致这种情况会很高兴。
谢谢。
【问题讨论】:
听起来像是PostQuitMessage()
。在其上放置一个断点,然后查看堆栈跟踪以查看调用它的内容。
在您的消息队列中看起来像 WM_QUIT
。如果您此时拨打MessageBox
- 它就会退出。如果你删除这个WM_QUIT
- MessageBox
照常运行
好吧,没有必要跟踪代码,因为只需查看Window
类源代码就会发现它总是在销毁时发布退出消息。所以这种行为“不是错误,而是功能”;-)
谢谢!我设置了一个断点,发现它正在被 ~Window 中的 DestroyWindow 调用(或者更确切地说,这导致在我的消息处理程序中调用 PostQuitMessage)。注释掉该行后,消息框按预期显示。
@Slidy DestroyWindow()
不会发布 WM_QUIT
消息。 WM_DESTROY
也不会传递给 DefWindowProc()
。这是因为一个应用程序一次可以有多个处于活动状态的窗口。销毁 any 窗口不应终止应用程序。例如,仅在破坏“主”窗口时。因此,在您未显示的代码中某处,PostQuitMessage()
必须被调用。
【参考方案1】:
WM_QUIT
消息告诉您的应用程序退出。如果队列中有 WM_QUIT 消息,Windows 会自动阻止一些窗口完成创建,以防止任何模式吃掉消息或被正确处理。
The Old New Thing on WM_QUIT and modality
如果这不是您想要的行为,那么您需要在错误/退出时将您的 Window
类实现更改为不是 PostQuitMessage
。
感谢@Remy Lebeau 找到链接。
【讨论】:
相关:Modality, part 3: The WM_QUIT message 谢谢。我想把它包括在内,但丢失了。以上是关于消息框不显示的主要内容,如果未能解决你的问题,请参考以下文章