- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经使用 COM
创建了一个 windows 的 shell 扩展,但是我似乎无法正确匹配我在 IContextMenu::QueryContextMenu
的重载中添加的项目的 ID使用我在 IContextMenu::InvokeCommand
的重载中收到的内容。在我的代码中,我使用了 InsertMenu
和 InsertMenuItem
(据我所知,它们的作用相同,但后者具有更多功能?)。但是,我不确定传递给 InsertMenu
/InsertMenuItem
的哪些参数与我必须在 LPCMINVOKECOMMANDINFO::lpVerb
中查找的内容相对应。我需要一些方法来轻松知道当我将项目 x
、y
、z
添加到上下文菜单时,我可以准确地知道是哪一个x
、y
或 z
已被点击。
编辑:似乎动词等于当前菜单/子菜单中项目从上到下的编号。但是我有两个子菜单,每个子菜单都有 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
标志来为每个菜单项指定一个 ID,并设置MENUITEMINFO.wID
值。
为您的每个菜单项提供一个从上面定义的命令 ID 派生的 ID,加上传递到 QueryContextMenu 中的 idCmdFirst 的值
。例如。 “Do Something”菜单项将 MENUITEMINFO.wID
设置为 idCmdFirst + CMDID_DOSOMETHING
,而“Do Something Else”将具有 MENUITEMINFO.wID
设置为 idCmdFirst + CMDID_DOSOMETHINGELSE
。
QueryContextMenu
的返回值需要是 MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x)
其中 x 是您添加的编号最高的项目加 1(或者,如果所有项目都按顺序编号,则为项目总数)。基本上,您是在告诉主机现在正在使用哪些菜单项 ID 值,以便其他上下文菜单扩展不会添加与您的冲突的项目。在上面的示例中,您将返回 MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST)
。
在 IContextMenu::InvokeCommand
中:
IS_INTRESOURCE
宏测试 lpVerb
(或 lpVerbW
)是否为整数值。LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE
。关于c++ - COM IContextMenu::InvokeCommand - 匹配 LPCMINVOKECOMMANDINFO::lpVerb 到项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172714/
我不是反对使用 pCmdInfo->lpVerb 但我的问题是当我们动态创建右键单击子菜单时我们将如何处理这种情况。例如,我有以下场景: if(strcmp(cRegKeyVal,"Connected
我已经使用 COM 创建了一个 windows 的 shell 扩展,但是我似乎无法正确匹配我在 IContextMenu::QueryContextMenu 的重载中添加的项目的 ID使用我在 IC
我是一名优秀的程序员,十分优秀!