在C ++中根据鼠标位置查找菜单项

时间:2011-06-07 06:44:20

标签: c++ windows menu menuitem

我正试图从另一个应用程序中获取菜单项。

我可以通过手动获取主菜单的句柄并遍历其子菜单来完成此操作。但是很难找出给定菜单有多少级别的子菜单。例如,如果我们看一下outlook视图菜单这样的东西,View - >安排 - >当前视图 - >消息。

所以我决定根据鼠标位置获取菜单项。但我无法找到办法做到这一点。

请提出一些建议。

1 个答案:

答案 0 :(得分:2)

我怀疑你想要实现的目标或多或少是不可能的,因为windows中的菜单系统是如何设计的。

请注意,可能存在一些非传统的方法,但是我怀疑你会发现这样的解决方案比现有的遍历菜单层次结构的策略承担更少的工作量。

事实上,菜单和子菜单的层次结构实际上是常规菜单的树。在MFC中你有一个CMenu对象树,在win32 C api中它是一个HMENU句柄树。

每个菜单,无论是子菜单还是主菜单,都有许多项目本身不是对象。即没有名为CMenuItem的MFC类,也没有名为HMENUITEM的win32 API句柄类型。如果你看一下处理菜单的任何函数,它总是传递一个菜单项的ID。例如,请查看CMenu::EnableMenuItemCMenu::GetDefaultItem

现在,真正的问题包括两个事实 - 菜单项是它们所在菜单的本地。如果查看C API中的任何函数,您总是需要同时指定菜单句柄和菜单项ID ,由于项目ID无法解析,除非框架知道您正在谈论哪个菜单对象。因此ID不是全局的。在MFC中,您通常不需要指定菜单句柄,但这是因为CMenu对象本身包装了HMENU句柄。

问题的第二部分是没有从位置检索菜单(CMenu或HMENU)的自然方法。您可以从位置到MenuItemFromPoint获取菜单项,但是如您所见,您还需要菜单句柄,并且返回的ID仅与您指定的菜单句柄结合使用。由于除了遍历子菜单层次结构之外,您无法以任何其他方式处理该菜单 - 您将回到原点。

作为最后一点 - Visual C ++菜单(CMenu)的功能总是局限于Win32 C API menu functions的功能,因此在那里找不到的任何功能或多或少都无法实现。