消息框不显示

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 谢谢。我想把它包括在内,但丢失了。

以上是关于消息框不显示的主要内容,如果未能解决你的问题,请参考以下文章

为啥列表框不使用 Visual C++ 6 显示元素?

为啥这个组合框不显示项目?

右边框不显示

边界框不显示

组合框不显示图像

Angular 高级搜索框不显示建议值