Windows 打开主菜单是否始终是一种模式操作?

Windows 打开主菜单是否始终是一种模式操作?,windows,winapi,menu,modal-dialog,Windows,Winapi,Menu,Modal Dialog,我不知道怎么做,但当窗口的主菜单打开时,程序中的主消息循环(PeekMessage/GetMessage等)似乎停止了。这种行为似乎很像打开了一个模式对话框,因为消息到达时仍然会调用我的WindowProc,所以一定有其他消息循环在某处保持这种情况 我还不知道这是怎么发生的(还没有测试),哪个函数或消息阻止了主消息循环,我猜它发生在DefWindowProc中的某个消息中,该消息与打开菜单有关 这是Windows主菜单的默认行为吗?这种情况的真正意义是什么?是否可以更改它以使主消息循环继续运行,

我不知道怎么做,但当窗口的主菜单打开时,程序中的主消息循环(PeekMessage/GetMessage等)似乎停止了。这种行为似乎很像打开了一个模式对话框,因为消息到达时仍然会调用我的WindowProc,所以一定有其他消息循环在某处保持这种情况

我还不知道这是怎么发生的(还没有测试),哪个函数或消息阻止了主消息循环,我猜它发生在DefWindowProc中的某个消息中,该消息与打开菜单有关


这是Windows主菜单的默认行为吗?这种情况的真正意义是什么?是否可以更改它以使主消息循环继续运行,而不是某些内部消息循环?

我错了,所以我更新了此答案

Windows通常在显示菜单时进入内部模式消息循环。当Windows进入此循环时,此消息将通知您

通过设置
MNS\u无模式
标志,可以使菜单无模式。例如,您可以对窗口
hWnd
执行此操作,因此:

HMENU hMenu = GetMenu(hWnd);
MENUINFO menuInfo;
menuInfo.cbSize = sizeof(MENUINFO);
menuInfo.fMask = MIM_STYLE;
GetMenuInfo(hMenu, &menuInfo);
menuInfo.fMask = MIM_STYLE;
menuInfo.dwStyle |= MNS_MODELESS;
SetMenuInfo(hMenu, &menuInfo);

不幸的是,当菜单打开时,这会导致主窗口失去激活,这在视觉上会分散注意力。的第二部分解释了菜单如何在模态情况下避免此问题。暗示解决方案;您需要干扰
WM\u NCACTIVATE
消息,以便主窗口的外观与其激活不同步。

对于hMenuBar,您可以尝试以下方法: 1) MENUINFO.fMask | MIM|u风格| MIM|u应用程序子菜单, 2) GetMenuInfo(hMenuBar,addr MENUINFO), 3) MENUINFO.dwStyle | MNS|u无模式,
4) SetMenuInfo(hunubar,addr MENUINFO)。

是的,它就是这样工作的。当Windows进入其模式菜单循环时,该消息将通知您。除了自己制作菜单,你无法避免这种情况。你知道他们为什么这样做吗?这种设计至少有20年的历史了。我想这是当时最简单、最便宜的方法。虽然你已经找到了问题所在,但这很少是一个问题。@arx你的两条评论就是这个问题的答案。你应该自己发布答案,而不是我自己重复。那么MENUINFO.dwStyle | MNS|u MODELESS呢?@kero你说得对。当菜单被激活时,这会影响窗口的外观,因此我更新了我的答案,在其中加入了一些注释。