我已经为COM
的Windows创建了一个shell扩展,但是我似乎无法正确匹配我在IContextMenu::QueryContextMenu
的重载中添加的项的ID与我在{的重载中收到的内容的ID。 {1}}。在我的代码中,我使用IContextMenu::InvokeCommand
和InsertMenu
(据我所知他们做同样的事情,但后者有更多功能?)。但是我不确定传递给InsertMenuItem
/ InsertMenu
的哪些参数对应于我在InsertMenuItem
中必须查找的内容。我需要一些方法来轻松了解当我将项LPCMINVOKECOMMANDINFO::lpVerb
,x
,y
添加到上下文菜单时,我可以确切地知道z
,{{{已单击1}}或x
。
编辑:似乎动词等于当前菜单/子菜单中项目从上到下的数字。但是我有两个子菜单,每个子菜单有y
个项目,因此它们具有相同的1,2,3的ID。如何设置自定义ID?
答案 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
)是否为整数值。IS_INTRESOURCE
。