我不知道怎么回事,但似乎当打开窗口的主菜单时,我的程序中的主消息循环(PeekMessage/GetMessage 等...)停止。这种行为似乎很像打开模式对话框,因为当消息到达时我的 WindowProc 仍然会被调用,所以一定有其他消息循环在某个地方保持这种情况发生。
我还不知道这是如何发生的(尚未测试),哪个函数或消息阻止了主消息循环,我猜测它发生在 DefWindowProc 中的某个位置,因为某些消息与打开菜单有关。
这是 Windows 主菜单的默认行为吗?在这种情况下,这样做的真正意义是什么?是否可以对其进行更改,以便主消息循环继续运行,而不是某些内部消息循环?
最佳答案
我错了,所以我更新了这个答案。
Windows 在显示菜单时通常会进入内部模式消息循环。 WM_ENTERMENULOOP当 Windows 进入此循环时,消息会通知您。
您可以通过设置 MNS_MODELESS
标志来使菜单成为无模式菜单。例如,您可以对窗口 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);
不幸的是,这会导致您的主窗口在打开菜单时失去激活状态,从而在视觉上分散注意力。第二部分this answer解释了菜单如何在模态情况下避免此问题。 This answer提示解决方案;您需要干扰 WM_NCACTIVATE
消息,以便主窗口的外观与其激活不同步。
关于windows - 打开主菜单总是模态操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870200/