Mfc 为什么我的AfxMessageBox在按下Alt之前不可见/隐藏?

Mfc 为什么我的AfxMessageBox在按下Alt之前不可见/隐藏?,mfc,visual-studio-2019,Mfc,Visual Studio 2019,我正在开发一个MFC应用程序。我有一个继承自CWinApp的类,它试图在其InitInstance函数中打开一个AfxMessageBox 调用AfxMessageBox函数时,没有可见的消息框,但我听到了Windows铃声。如果按Alt键,则会出现消息框为什么AfxMessageBox没有立即出现? 这个问题提到了一个类似的问题,但答案只涉及非MFC函数MessageBox,而不是AfxMessageBox,这正是我正在使用的: 更新1 我正在研究一个最小的可复制示例,但这很棘手,因为这是

我正在开发一个MFC应用程序。我有一个继承自
CWinApp
的类,它试图在其
InitInstance
函数中打开一个
AfxMessageBox

调用
AfxMessageBox
函数时,没有可见的消息框,但我听到了Windows铃声。如果按Alt键,则会出现消息框为什么
AfxMessageBox
没有立即出现?

这个问题提到了一个类似的问题,但答案只涉及非MFC函数
MessageBox
,而不是
AfxMessageBox
,这正是我正在使用的:


更新1 我正在研究一个最小的可复制示例,但这很棘手,因为这是一个封装性差的大型应用程序的一部分

在我的应用程序中,对函数
ProcessShellCommand()
的调用似乎导致
AfxMessageBox
停止工作。但是,在新创建的MFC应用程序中,对
AfxMessageBox
的调用在
ProcessShellCommand
之前和之后都能正常工作

调用
ProcessShellCommand
似乎会导致
AfxMessageBox
的行为有所不同,但我不确定如何识别调用
ProcessShellCommand
的所有后果。调试时,对ProcessShellCommand的特定调用包含一个文件名,因此file open命令会启动应用程序的
CView

在my
CView
-继承类的
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
函数,它不满足您的需要。