检测HMENU是否为弹出菜单或下拉菜单

时间:2013-12-22 10:27:47

标签: winapi menu

在给定HMENU的情况下,我可以检测它是弹出菜单还是下拉菜单?

我想创建现有菜单的(深度修改)副本,并且根据此属性,我需要分别使用CreatePopupMenuCreateMenu

2 个答案:

答案 0 :(得分:3)

作为Raymond Chen says here(我强调):

  

CreateMenu创建一个水平菜单栏,适合附加到   顶级窗口。这是一种菜单,上面写着“文件,编辑”和   等等。 CreatePopupMenu创建一个适合的垂直弹出菜单   用作另一个菜单的子菜单(水平菜单栏或   另一个弹出菜单)或作为上下文菜单的根。

     

如果你把两个弄糊涂了,你就会得到奇怪的菜单行为。   Windows在极少数情况下检测到您混淆了两者和   适当转换,但我不会成功依赖Windows   读你的思想。

     

无法取出菜单并询问它是水平还是水平   垂直。你必须知道。

答案 1 :(得分:1)

不清楚hmenu:

1)如果你谈到与现有窗口(类#32768)相对应的hmenu,只需验证(通过GetGUIThreadInfo)GUITHREADINFO.flags:可用GUI_INMENUMODE没有GUI_POPUPMENUMODE而没有GUI_SYSTEMMENUMODE意味着这个菜单 - 下拉。< / p>

2)如果你谈论内存中存在的hmenu,我们必须找到这个hmenu的根父(顺便说一句,对于菜单,可能有多个,与根父窗口相反)。 然后调用TrackPopupMenu找到已找到的根父级,并在WM_ENTERIDLE上调用hwnd适当的窗口(类#32768)并调用GetClientRect:如果Rect = 0,则根parent =菜单栏(可以通过LoadMenu(间接)或通过CreateMenu创建),意味着原始的hmenu - 下拉(不仅可以通过CreatePopupMenu创建,还可以通过CreateMenu创建)。

至于R.Chen的链接。实际上,系统总是记得在内存中如何创建hmenu。但是这个机制(就像菜单上的其他许多内容一样)没有记录,雷蒙德显然认为没必要揭开它......