COM IContextMenu::InvokeCommand - 匹配 LPCMINVOKECOMMANDINFO::lpVerb 到项目

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

我已经用 COM 为 windows 创建了一个 shell 扩展,但是我似乎无法正确匹配我在 [=13= 的重载中添加的项目的 ID ] 与我在 IContextMenu::InvokeCommand 的超载中收到的内容。在我的代码中,我使用了 InsertMenuInsertMenuItem(据我所知,它们的作用相同,但后者具有更多功能?)。但是,我不确定传递给 InsertMenu/InsertMenuItem 的哪些参数与我必须在 LPCMINVOKECOMMANDINFO::lpVerb 中寻找的内容相对应。我需要一些方法来轻松知道当我将项目 xyz 添加到上下文菜单时,我可以准确地知道 xyz 已被点击。

编辑:动词似乎等于当前menu/submenu中项目从上到下的编号。但是我有两个子菜单,每个子菜单都有 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,如上定义,加上 idCmdFirst[=54 的值=] 传递给 QueryContextMenu。例如。 "Do Something" 菜单项会将 MENUITEMINFO.wID 设置为 idCmdFirst + CMDID_DOSOMETHING,而 "Do Something Else" 会将 MENUITEMINFO.wID 设置为 idCmdFirst + CMDID_DOSOMETHINGELSE.

  • 来自 QueryContextMenu 的 return 值需要是 MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x) 其中 x 是最高的 ID-您添加的编号项目加 1(或者,如果所有项目都按顺序编号,则为项目总数)。基本上,您是在告诉主机现在正在使用哪些菜单项 ID 值,以便其他上下文菜单扩展不会添加与您的冲突的项目。在上面的例子中,你会 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST).

IContextMenu::InvokeCommand中:

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