获取我刚刚在其他窗口中单击的 SubMenuItem
Posted
技术标签:
【中文标题】获取我刚刚在其他窗口中单击的 SubMenuItem【英文标题】:Get SubMenuItem I just clicked on in other window 【发布时间】: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。这就是它的用途。 谢谢!!!这是一个很好的建议,你的方法要好得多。 【参考方案1】:请记住,MSDN 文章“MenuItemFromPoint 函数”中有一个错误:对于参数“ptScreen”,您必须使用屏幕坐标(而不是客户端坐标)。
【讨论】:
以上是关于获取我刚刚在其他窗口中单击的 SubMenuItem的主要内容,如果未能解决你的问题,请参考以下文章
我刚刚安装了vs2010,然后在建立数据库时出现了下面的窗口,怎么解决?求教!!!急急急!!!
单击图标时如何在 JqGrid 中打开带有 TextArea 的弹出窗口?