在C++中根据鼠标位置查找菜单项
Find menu item based on mouse position in C++
我正在尝试从另一个应用程序获取菜单项。
我可以通过手动获取主菜单的句柄并在其子菜单中循环来实现这一点。但是很难找出给定菜单有多少级别的子菜单。例如,如果我们在outlook视图菜单中看到这样的东西,view(视图)->Arrangeby(排列方式)->Current view(当前视图)->Messages(消息)。
所以我决定根据鼠标的位置来获取菜单项。但是我找不到办法。
请提出一些这样做的想法。
我怀疑,由于windows中的菜单系统的设计方式,您试图实现的目标或多或少是不可能的。
请注意,可能有一些非传统的方法来解决这一问题,但我怀疑您是否会找到这样一种解决方案,它比您当前遍历菜单层次结构的策略所需的工作量更少。
问题是,菜单和子菜单的层次结构实际上是一棵常规菜单树。在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菜单函数的功能,因此在那里找不到的任何功能或多或少都是遥不可及的。
- 如何使用 lldb 查找我的代码运行的位置
- 在 elf 文件中查找全局变量的位置
- 如何查找 winsock.h 在 Visual Studio 中的包含位置
- 查找项目在哈希表中的位置
- 如何设置 cmake 以在不同位置查找标头和库
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 查找 2D 向量的位置,该向量是类C++的一个元素
- 查找编译时构造类的内存位置
- GDB 如何查找函数退出的位置
- 查找 std::integer_sequence 中首次出现的值的位置
- 指定Qt查找OpenSSL DLL的位置
- 从输入 1 查找输入 2 中字符的位置
- 想要查找二进制码字中出现的 1 或 0 的位置
- 强制 ld 在正确的位置查找 libSM.so
- GDAL 库仅在默认位置查找 UnixImageIO 框架
- 根据世界位置查找一维数组中的通用项目
- 我如何告诉 xcode 用于在特定位置查找文件的工具链
- 按位置查找未标记的模板选项/参数/参数
- 在C++中根据鼠标位置查找菜单项
- 从文件中的特定位置查找文件中字符串的最后一次出现