在C ++中查找基于鼠标位置的菜单项

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

我可以通过手动获取菜单的句柄,并通过其子菜单循环。 但是很难找出给定菜单有多less个子菜单。 例如,如果我们看一下Outlook视图菜单,可以查看 – >排列方式 – >当前视图 – >消息。

所以我决定得到基于鼠标位置的菜单项。 但我找不到办法做到这一点。

请提出一些想法来做到这一点。

对话框 – select选项

Windows窗体中的本机外观(类似于资源pipe理器)主菜单

Windows应用程序和CLR

如何判断VB6中菜单项的位置?

C ++ Windows将选项添加菜单

在Delphi中使用API​​ Win32启用检查菜单

Bash子菜单(selectjoin)

JavaScript来打开Windows的开始菜单

Windows开始菜单中的应用程序平铺属性

检查哪个键从USB或CD启动?

我怀疑你想要实现的东西或多或少不可能通过如何设计窗口中的菜单系统。

请注意,可能有一些非传统的方法,但是我怀疑你会找到这样一个解决方案,比你目前的遍历菜单层次的策略运行更少的工作量。

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

无论是子菜单还是主菜单,每个菜单都有一些本身不是对象的项目。 也就是说没有叫做cmenuItem的MFC类,也没有叫做HMENUITEM的win32 API句柄类型。 如果你看看处理菜单的任何函数,总是要传递一个菜单项的ID。 例如看看cmenu :: EnableMenuItem或cmenu :: GetDefaultItem 。

现在,真正的问题是由两个事实组成 – 菜单项对于它们所在的菜单是本地的。如果您在C API中查看任何函数,则总是需要指定菜单句柄和菜单项ID,这是由于物品ID不能被解析的事实,除非框架知道你在谈论哪个菜单对象。 因此,ID不是全球性的。 在MFC中,通常不需要指定菜单句柄,但是这是因为cmenu对象本身包装了HMENU句柄。

问题的第二部分是从位置检索菜单cmenu或HMENU)没有自然的方法。 您可以通过MenuItemFromPoint从位置获取菜单项,但正如您所看到的,您还需要菜单句柄,并且返回的ID仅在与指定的菜单句柄组合使用时才有效。 由于除了遍历子菜单层次之外,您无法获得菜单句柄,所以您已经回到了原来的位置。

最后要注意的是,Visual C ++菜单cmenu)的功能总是局限于Win32 C API菜单功能功能 ,所以没有找到的功能或多或少都遥不可及。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...