【发布时间】:2014-11-07 21:16:21
【问题描述】:
我想获取任何菜单项的文本。它适用于top-level menu(术语来自here,但我不明白如何让它与sub-menu items 一起使用。
例如我有以下菜单结构:
- 文件
- 打开
- 项目
- 解决方案
- 关闭
- 打开
- 退出
我希望能够导航到File->Open->Solution,当用户点击它时,会得到文本“解决方案”。
这是顶级菜单的代码(当我点击File时):
MSLLHOOKSTRUCT ms = new MSLLHOOKSTRUCT();
ms = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
IntPtr win = WindowFromPoint(ms.pt);
IntPtr menu = GetMenu(win);
int menuItem = MenuItemFromPoint(win, menu, ms.pt);
IntPtr subMenu = GetSubMenu(menu, menuItem); // this is not used for top level and is useless for submenus
StringBuilder menuName = new StringBuilder(0x20);
GetMenuString(menu, (uint)menuItem, menuName, 0x20, (uint)ModifyMenu.MF_BYPOSITION);
但是当我点击Open 或Solution 子菜单时,这不起作用,即使GetSubMenu 函数也不起作用,因为WindowFromPoint 返回错误的处理程序并且GetMenu 和GetSubMenu 返回0(所以基本上,当我单击子菜单时,我没有可以从中导航的锚,也找不到任何按点获取菜单项的功能,例如WindowFromPoint。MenuItemFromPoint 返回-1,可能是因为我的窗口处理程序错误)。
我还缺少其他任何 WinAPI 函数来实现这一点吗?
【问题讨论】:
-
忘记你在做什么,使用UI Automation。这就是它的用途。
-
谢谢!!!这是一个很好的建议,你的方法要好得多。
标签: winapi menu submenu menubar