获取SubMenuItem我只是在其他窗口中单击

时间:2014-11-07 21:16:22

标签: winapi menu submenu menubar

我想获取任何菜单项的文本。它适用于top-level menu(来自here的术语,但我不明白如何使用sub-menu items

例如,我有以下菜单结构:

  1. 文件
    1. 打开
      1. 项目
      2. 解决方案
    2. 关闭
  2. 退出
  3. 我希望能够导航到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返回错误的处理程序并且{{1}并且GetMenu返回0(所以基本上当我点击子菜单时,我没有一个achor来导航,也没有找到任何函数来按点获取菜单项,比如GetSubMenu。{{ 1}}返回-1,可能是因为我的Window处理程序错误了。)

    我还缺少任何其他WinAPI功能来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

请记住,MSDN文章“MenuItemFromPoint function”中存在错误:对于参数“ptScreen”,您必须使用屏幕坐标(但不能使用客户端坐标)。