再问关于菜单提取的问题(如果答出来了再加400分)

时间:2022-06-16 14:35:14
我有个程序用下面代码:
    CWnd *pWnd = CWnd::FindWindow(NULL,"CSDN_专家门诊 - Microsoft Internet Explorer");
    if (pWnd == NULL) return FALSE;
    CMenu *pMenu = pWnd->GetMenu();
    if (pMenu == NULL) return FALSE;
    for (int i = 0; i GetMenuItemCount; i++) {
      pMenu->GetMenuItemID(...);
      pMenu->GetMenuString(...);
    }
  上述代码工作除了在IE窗口外,别的窗口工作都很正常,请问怎样才能在IE窗口中正常使用,如果不是用这种方法,那又该用什么方法?

5 个解决方案

#1


是吗?有这样的问题吗?我没遇到过.

要不,你发一个测试的project给我,我看看,是那一步出的问题?
我很喜欢找Why?

my email: wangshx@365do.com

#2


你好,今天上午有空,我调了调你的代码.结果正如你所说.确实对explorer不行.
后来,我从各个角度来分析.得出以下结论:

(1) 菜单是一种资源,其与HWND在注册窗口类捆绑在一起.
    (2) explorer中的菜单实际上并不是与我们想象中的菜单一样.它并未与主窗口在一块捆绑.换句话说,explorer中的菜单是在一个ToolbarWindow32工具条窗口下的.
    (3) 而真正与 explorer主窗口捆绑在一块的菜单却是空的.即HMENU的资源是没有的.所以你GetMenuItemCount(...)取得的数量是0(实际上是0个Item).
    (4) 我曾想,既然在explorer中的菜单是在ToolbarWindow32工具条窗口绑在一起,那我通过它来取得菜单句柄不就达到目的了.但我用SPY查看.这个子窗口并没有hMend.
    (5) 所以,我最终得出结论.explorer中的菜单是在程序中动态创建的.并不是以资源的形式提供的(或者已经加密,最后再取出来).所以,无法用你的方法取得(即先通过窗口再取得菜单句柄)


我目前没想出什么特别好的方法去获取ie explorer中的菜单.
请超顶高手出现...

#3


我也想帮你看看,请发一个测试的project给我
huangliang5@yahoo.com

#4


谢谢freelybird(阿愚) 我看到了一个这样的信息,不知道怎么用!

IE有一个定义菜单,是用自定义系列控件中的弹出菜单。所以你就不能再使用枚举这种方法了,试一下处理WM_INITMENUPOPUP或WM_INITMENU。在VC的CD中有类似的例子(关于剪切与复制)你得到消息句柄时就可以列出所有的菜单项。上面的代码之所不工作可能是因为微软的自画菜单项的保存菜单项用了不同的格式,想要明白菜单和画标是否是自画的,你可以用这种方法测试lpmii->fType & MFT_OWNERDRAW.Ipmii是一个菜单结构,返回得到的菜单项信息。lpmii->dwTypeData 返回(菜单)项目的类型,如果dwTypeData返回的值没有什么用的话还有一个机会,lpmii->dwItemData将指向一个(程序)开始时的菜单项中的字符串结构。以上方法比较好,因为现在好多程序都使用自定义菜单。

#5


up

#1


是吗?有这样的问题吗?我没遇到过.

要不,你发一个测试的project给我,我看看,是那一步出的问题?
我很喜欢找Why?

my email: wangshx@365do.com

#2


你好,今天上午有空,我调了调你的代码.结果正如你所说.确实对explorer不行.
后来,我从各个角度来分析.得出以下结论:

(1) 菜单是一种资源,其与HWND在注册窗口类捆绑在一起.
    (2) explorer中的菜单实际上并不是与我们想象中的菜单一样.它并未与主窗口在一块捆绑.换句话说,explorer中的菜单是在一个ToolbarWindow32工具条窗口下的.
    (3) 而真正与 explorer主窗口捆绑在一块的菜单却是空的.即HMENU的资源是没有的.所以你GetMenuItemCount(...)取得的数量是0(实际上是0个Item).
    (4) 我曾想,既然在explorer中的菜单是在ToolbarWindow32工具条窗口绑在一起,那我通过它来取得菜单句柄不就达到目的了.但我用SPY查看.这个子窗口并没有hMend.
    (5) 所以,我最终得出结论.explorer中的菜单是在程序中动态创建的.并不是以资源的形式提供的(或者已经加密,最后再取出来).所以,无法用你的方法取得(即先通过窗口再取得菜单句柄)


我目前没想出什么特别好的方法去获取ie explorer中的菜单.
请超顶高手出现...

#3


我也想帮你看看,请发一个测试的project给我
huangliang5@yahoo.com

#4


谢谢freelybird(阿愚) 我看到了一个这样的信息,不知道怎么用!

IE有一个定义菜单,是用自定义系列控件中的弹出菜单。所以你就不能再使用枚举这种方法了,试一下处理WM_INITMENUPOPUP或WM_INITMENU。在VC的CD中有类似的例子(关于剪切与复制)你得到消息句柄时就可以列出所有的菜单项。上面的代码之所不工作可能是因为微软的自画菜单项的保存菜单项用了不同的格式,想要明白菜单和画标是否是自画的,你可以用这种方法测试lpmii->fType & MFT_OWNERDRAW.Ipmii是一个菜单结构,返回得到的菜单项信息。lpmii->dwTypeData 返回(菜单)项目的类型,如果dwTypeData返回的值没有什么用的话还有一个机会,lpmii->dwItemData将指向一个(程序)开始时的菜单项中的字符串结构。以上方法比较好,因为现在好多程序都使用自定义菜单。

#5


up