windows - 打开主菜单总是模态操作吗?

标签 windows winapi menu modal-dialog

我不知道怎么回事,但似乎当打开窗口的主菜单时,我的程序中的主消息循环(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/

相关文章:

windows - 什么检测图片类型的方法比较靠谱 : content-type or MIME-sniffing?

c++ - LoadCursorFromFile 返回 NULL。 GetLastError 也为 0

objective-c - 是否可以在Windows计算机上编译Objective-C,但对于Mac

c++ - 尝试显示屏幕保护程序的配置窗口时出现问题(来自以高强制完整性级别运行的 GUI 应用程序)

.net - 如何使用 .Net 直接读取磁盘?

asp.net - MVC 3 中突出显示菜单和子菜单?

menu - magento : trying to decipher level-top

windows - 从 Windows 构建 R 源代码

c++ - 使用 WinAPI 附加禁用的显示设备

android - 为什么菜单没有为您预先充气?