gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:00:40 25 4
gpt4 key购买 nike

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

编辑:似乎动词等于当前菜单/子菜单中项目从上到下的编号。但是我有两个子菜单,每个子菜单都有 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)是否为整数值。
  • 如果是这样,命令ID 可以在低位字中找到。例如,如果用户选择了“Do Something Else”,您会发现 LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE

关于c++ - COM IContextMenu::InvokeCommand - 匹配 LPCMINVOKECOMMANDINFO::lpVerb 到项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com