COM IContextMenu::InvokeCommand - matching LPCMINVOKECOMMAND

COM IContextMenu::InvokeCommand - matching LPCMINVOKECOMMANDINFO::lpVerb to item

本文关键字:matching LPCMINVOKECOMMAND InvokeCommand IContextMenu COM      更新时间:2023-10-16

我已经为COM的窗口创建了一个shell扩展,但是我似乎无法正确匹配我在IContextMenu::QueryContextMenu过载中添加的项目的id与我在IContextMenu::InvokeCommand过载中收到的内容。在我的代码中,我使用InsertMenuInsertMenuItem(据我所知,它们做同样的事情,但后者有一些更多的功能?)。然而,我不确定传递给InsertMenu/InsertMenuItem的参数对应于我必须在LPCMINVOKECOMMANDINFO::lpVerb中寻找的内容。我需要一些方法来轻松地知道,当我将x, y, z添加到上下文菜单时,我可以确切地知道x, yz中的哪一个已被单击。

编辑:动词似乎等于当前菜单/子菜单中从上到下的项目的数字。然而,我有两个子菜单,每个都有x数量的物品,所以它们有相同的id 1,2,3。如何设置自定义id之类的?

首先你应该定义一个枚举来保存菜单项的命令id,例如

enum {
    CMDID_FIRST = 0,
    CMDID_DOSOMETHING = CMDID_FIRST,
    CMDID_DOSOMETHINGELSE,
    CMDID_LAST,
};

这些ID值需要从0开始。

在你的IContextMenu::QueryContextMenu实现中:

  • 当您添加菜单项时,您需要通过在MENUITEMINFO.fMask字段中设置MIIM_ID标志并设置MENUITEMINFO.wID值来给每个菜单项一个ID。

  • 给每个菜单项一个从上面定义的命令ID派生的ID, 加上idCmdFirst传递给QueryContextMenu的值。例如,"做某事"菜单项将MENUITEMINFO.wID设置为idCmdFirst + CMDID_DOSOMETHING,而"做某事"将MENUITEMINFO.wID设置为idCmdFirst + CMDID_DOSOMETHINGELSE

  • QueryContextMenu的返回值需要是MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x),其中x是您添加的编号最高的项目的ID加上1(或者,如果所有项目按顺序编号,则为项目总数)。基本上,您要告诉主机当前正在使用哪些菜单项ID值,这样就不会有其他上下文菜单扩展添加与您的菜单项冲突的项。在上面的示例中,您将返回MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST) .

In IContextMenu::InvokeCommand:

  • 使用IS_INTRESOURCE宏测试lpVerb(或lpVerbW)是否为整数值。
  • 如果是,命令ID可以在低字中找到。例如,如果用户选择"Do Something Else",你会发现LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE .
相关文章: