COM IContextMenu :: InvokeCommand - 将LPCMINVOKECOMMANDINFO :: lpVerb与项目

时间:2015-10-16 14:17:20

标签: c++ com contextmenu shell-extensions

我已经为COM的Windows创建了一个shell扩展,但是我似乎无法正确匹配我在IContextMenu::QueryContextMenu的重载中添加的项的ID与我在{的重载中收到的内容的ID。 {1}}。在我的代码中,我使用IContextMenu::InvokeCommandInsertMenu(据我所知他们做同样的事情,但后者有更多功能?)。但是我不确定传递给InsertMenuItem / InsertMenu的哪些参数对应于我在InsertMenuItem中必须查找的内容。我需要一些方法来轻松了解当我将项LPCMINVOKECOMMANDINFO::lpVerbxy添加到上下文菜单时,我可以确切地知道z,{{{已单击1}}或x

编辑:似乎动词等于当前菜单/子菜单中项目从上到下的数字。但是我有两个子菜单,每个子菜单有y个项目,因此它们具有相同的1,2,3的ID。如何设置自定义ID?

1 个答案:

答案 0 :(得分:1)

首先,您应该定义一个包含菜单项命令ID的枚举,例如

enum {
    CMDID_FIRST = 0,

    CMDID_DOSOMETHING = CMDID_FIRST,
    CMDID_DOSOMETHINGELSE,

    CMDID_LAST,
};

这些ID值需要从0开始。

IContextMenu::QueryContextMenu实施中:

  • 当您添加菜单项时,您需要通过在MIIM_ID字段中设置MENUITEMINFO.fMask标记并设置MENUITEMINFO.wID值来为每个菜单项提供ID。 / p>

  • 为每个菜单项提供一个ID,该ID来自上面定义的命令ID,加上 idCmdFirst 的值,传递给{{1} }。例如。 "做某事"菜单项的QueryContextMenu设置为MENUITEMINFO.wID,"做其他事情"将idCmdFirst + CMDID_DOSOMETHING设置为MENUITEMINFO.wID

  • idCmdFirst + CMDID_DOSOMETHINGELSE的返回值需要为QueryContextMenu,其中 x 是您添加的最高编号项目的ID加1(或者,如果全部项目按顺序编号,项目总数)。基本上,您告诉主持人现在正在使用哪些菜单项ID值,以便其他任何上下文菜单扩展都不会添加与您冲突的项目。在上面的示例中,您将返回MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x)

MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST)

  • 使用IContextMenu::InvokeCommand宏测试lpVerb(或lpVerbW)是否为整数值。
  • 如果是,则可以在低位字中找到命令ID。例如,如果用户选择"做其他事情",你会发现IS_INTRESOURCE