COM IContextMenu::InvokeCommand - 匹配 LPCMINVOKECOMMANDINFO::lpVerb 到项目
COM IContextMenu::InvokeCommand - matching LPCMINVOKECOMMANDINFO::lpVerb to item
我已经用 COM
为 windows 创建了一个 shell 扩展,但是我似乎无法正确匹配我在 [=13= 的重载中添加的项目的 ID ] 与我在 IContextMenu::InvokeCommand
的超载中收到的内容。在我的代码中,我使用了 InsertMenu
和 InsertMenuItem
(据我所知,它们的作用相同,但后者具有更多功能?)。但是,我不确定传递给 InsertMenu
/InsertMenuItem
的哪些参数与我必须在 LPCMINVOKECOMMANDINFO::lpVerb
中寻找的内容相对应。我需要一些方法来轻松知道当我将项目 x
、y
、z
添加到上下文菜单时,我可以准确地知道 x
、y
或 z
已被点击。
编辑:动词似乎等于当前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
.
我已经用 COM
为 windows 创建了一个 shell 扩展,但是我似乎无法正确匹配我在 [=13= 的重载中添加的项目的 ID ] 与我在 IContextMenu::InvokeCommand
的超载中收到的内容。在我的代码中,我使用了 InsertMenu
和 InsertMenuItem
(据我所知,它们的作用相同,但后者具有更多功能?)。但是,我不确定传递给 InsertMenu
/InsertMenuItem
的哪些参数与我必须在 LPCMINVOKECOMMANDINFO::lpVerb
中寻找的内容相对应。我需要一些方法来轻松知道当我将项目 x
、y
、z
添加到上下文菜单时,我可以准确地知道 x
、y
或 z
已被点击。
编辑:动词似乎等于当前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 值,以便其他上下文菜单扩展不会添加与您的冲突的项目。在上面的例子中,你会 returnMAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST)
.
在IContextMenu::InvokeCommand
中:
- 使用
IS_INTRESOURCE
宏测试lpVerb
(或lpVerbW
)是否为整数值。 - 如果是这样,可以在低字中找到命令ID。例如,如果用户选择 "Do Something Else",您会发现
LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE
.