获取我刚刚在其他窗口中单击的 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);

但是当我点击OpenSolution 子菜单时,这不起作用,即使GetSubMenu 函数也不起作用,因为WindowFromPoint 返回错误的处理程序并且GetMenuGetSubMenu 返回0(所以基本上,当我单击子菜单时,我没有可以从中导航的锚,也找不到任何按点获取菜单项的功能,例如WindowFromPointMenuItemFromPoint 返回-1,可能是因为我的窗口处理程序错误)。

我还缺少其他任何 WinAPI 函数来实现这一点吗?

【问题讨论】:

忘记你在做什么,使用UI Automation。这就是它的用途。 谢谢!!!这是一个很好的建议,你的方法要好得多。 【参考方案1】:

请记住,MSDN 文章“MenuItemFromPoint 函数”中有一个错误:对于参数“ptScreen”,您必须使用屏幕坐标(而不是客户端坐标)。

【讨论】:

以上是关于获取我刚刚在其他窗口中单击的 SubMenuItem的主要内容,如果未能解决你的问题,请参考以下文章

VBA 无法获取您刚刚单击的按钮的属性

我刚刚安装了vs2010,然后在建立数据库时出现了下面的窗口,怎么解决?求教!!!急急急!!!

单击图标时如何在 JqGrid 中打开带有 TextArea 的弹出窗口?

调整窗口大小时如何使用鼠标单击获取图像坐标?

如何通过单击tkinter中不同窗口中的按钮来获取位于窗口中的GUI文本字段的参数? [重复]

利用Windows API 在指定的窗口上单击一次鼠标