我想获取任何菜单项的文本。它适用于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
返回错误的处理程序并且{{1}并且GetMenu
返回0(所以基本上当我点击子菜单时,我没有一个achor来导航,也没有找到任何函数来按点获取菜单项,比如GetSubMenu
。{{ 1}}返回-1,可能是因为我的Window处理程序错误了。)
我还缺少任何其他WinAPI功能来实现这一目标吗?
答案 0 :(得分:0)
请记住,MSDN文章“MenuItemFromPoint function”中存在错误:对于参数“ptScreen”,您必须使用屏幕坐标(但不能使用客户端坐标)。