Mfc 为什么我的AfxMessageBox在按下Alt之前不可见/隐藏?
我正在开发一个MFC应用程序。我有一个继承自Mfc 为什么我的AfxMessageBox在按下Alt之前不可见/隐藏?,mfc,visual-studio-2019,Mfc,Visual Studio 2019,我正在开发一个MFC应用程序。我有一个继承自CWinApp的类,它试图在其InitInstance函数中打开一个AfxMessageBox 调用AfxMessageBox函数时,没有可见的消息框,但我听到了Windows铃声。如果按Alt键,则会出现消息框为什么AfxMessageBox没有立即出现? 这个问题提到了一个类似的问题,但答案只涉及非MFC函数MessageBox,而不是AfxMessageBox,这正是我正在使用的: 更新1 我正在研究一个最小的可复制示例,但这很棘手,因为这是
CWinApp
的类,它试图在其InitInstance
函数中打开一个AfxMessageBox
调用AfxMessageBox
函数时,没有可见的消息框,但我听到了Windows铃声。如果按Alt键,则会出现消息框为什么AfxMessageBox
没有立即出现?
这个问题提到了一个类似的问题,但答案只涉及非MFC函数MessageBox
,而不是AfxMessageBox
,这正是我正在使用的:
更新1 我正在研究一个最小的可复制示例,但这很棘手,因为这是一个封装性差的大型应用程序的一部分 在我的应用程序中,对函数
ProcessShellCommand()
的调用似乎导致AfxMessageBox
停止工作。但是,在新创建的MFC应用程序中,对AfxMessageBox
的调用在ProcessShellCommand
之前和之后都能正常工作
调用ProcessShellCommand
似乎会导致AfxMessageBox
的行为有所不同,但我不确定如何识别调用ProcessShellCommand
的所有后果。调试时,对ProcessShellCommand的特定调用包含一个文件名,因此file open命令会启动应用程序的CView
在myCView
-继承类的OnInitialUpdate
代码中,AfxMessageBox
功能正常。在AfxMessageBox
工作和不工作之间,我能识别的最佳转换点是CView
的OnInitialUpdate
函数从它被ProcessShellCommand
调用时返回
更新2 在调用
ProcessShellCommand
之前(而AfxMessageBox
正在按预期工作),似乎m_pMainWnd
为NULL
,在调用ProcessShellCommand
之后为非NULL
根据这一讨论:
,我尝试在调用ProcessShellCommand
之前和之后打印消息队列内容。以前,消息队列只包含一条消息。之后,消息队列打印输出循环充满了WM_PAINT
,在我按下Alt之前,它从未终止。这使我认为我遇到了与消息泵相关的问题,而不是与可见性状态相关的问题
----------更多观察------------
看起来对AfxMessageBox的调用在win32u.dll内停止;我通过在等待消息框出现时点击“暂停执行”按钮来确定这一点。以下是调用堆栈和调试屏幕截图:
事实证明,我的
CWinApp
有一个CFrameWnd
类我已经忘记了;我太专注于CView
课程了
在CFrameWnd
类中,在BEGIN\u MESSAGE\u MAP
块中,在\u WM\u TIMER()上有一个。我从要测试的消息映射中删除了它,并且AfxMessageBox()按预期工作
当我创建一个新的SDI应用程序时,消息映射块中的\u WM\u PAINT()
上没有,因此我认为这可能是添加错误的。类本身没有实现OnPaint()
,因此我猜这会导致一些未处理的WM\u PAINT
消息四处浮动
这并没有导致编译器错误,这有点令人惊讶;据我所知,只有当有相应的OnPaint()
函数时,才有意义使用ON\u WM\u PAINT()
函数。a是必需的。VS的哪个版本?另请参见@dxiv VS2019。谢谢,我检查了这个链接-似乎是建议通过PostMessage(WM_SYSKEYDOWN)以编程方式创建按键来解决问题。这可能是一个好的创可贴,但我更愿意解决这个“正确”的方式。当时,阿法利被报告为一个bug,但是微软连接站点已经退出,旧链接不再工作。本质上是一种包装。后者接受显式的所有者窗口句柄。前者没有,所有者是从应用程序状态推断出来的。MFC就是这样:它似乎简化了界面,但却要求用户了解其内部实现的几乎每个方面。从单步进入AfxMessageBox
开始,然后从那里开始。可能是基类提供了一个默认的OnPaint
函数,它不满足您的需要。