首页 > 解决方案 > 如何使用 IExecuteCommand 和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?

问题描述

我正在考虑按照基于 的新 Windows 7+ 方法开发上下文菜单 shell 扩展IExecuteCommand,如本文所述:

使用 IExecuteCommand 简化上下文菜单扩展

IContextMenu而不是我更熟悉的经典方法。

我对这种新方法有几个问题:

  1. 如何在自定义菜单项中显示本地化文本(例如,从资源加载)?在旧模型中,这可以简单地InsertMenuIContextMenu::QueryContextMenu实现中调用,并传递从资源加载的字符串。

  2. 如何将图标与我的自定义菜单项关联并显示?同样,这可以在IContextMenu基于 old 的模型中完成,例如调用SetMenuItemBitmaps. 菜单图标是否需要特定的图像格式?

标签: c++winapicontextmenuwindows-shellshell-extensions

解决方案


IExecuteCommand用于在注册表中静态注册并具有"DelegateExecute"="{clsid}"与之关联的值的外壳动词。静态动词的菜单文本取自为动词注册的显示文本,并且该文本按原样显示,无法本地化,因为根本没有提供选项来指定文本的替代来源。只有真正的 shell 扩展基于IContextMenuIExplorerCommand可以选择本地化文本并为其自定义动词提供图标。IExecuteCommand不提供该功能

更新:在 Windows XP 及更高版本上,静态动词的显示文本可识别MUI,因此您可以提供引用本地化资源的显示文本。这是记录在案的:

使用注册表字符串重定向

为 Shell 动词操作字符串提供资源

当用户在 Windows 资源管理器中右键单击文件时,会在弹出菜单中显示某些动词的操作字符串,例如“打开”和“编辑”。您的应用程序不必为常见的 shell 动词指定字符串,因为 shell 对这些动词有自己的启用 MUI 的默认值。但是,您应该为表示不常见动词的字符串提供可本地化的字符串资源。

在 Windows XP 之前的操作系统上,注册表中 shell 动词的字符串使用以下语法呈现,其中 verb 指定实际的动词名称:

HKCR\<progid>\shell\<verb>
@ = <friendly-name>

这是一个例子:

HKCR\Sample.app\shell\Disc
@ = "Disconnect"

在 Windows XP 及更高版本上,您可以使用间接级别使操作字符串依赖于用户界面语言。这些操作系统支持用于定义 MUI 兼容字符串的 MUIVerb 值。下面是一个不常见动词的注册表项示例:

HKCR\Sample.app\shell\Disc
@ = "Disconnect"
"MUIVerb" = "@%systemroot%\system32\sample.exe,-9875"

您的 MUI 应用程序还应该能够将旧的默认值注册为可本地化的字符串,如下所示:

HKCR\Sample.app\shell\Disc
@ = "@%systemroot%\system32\sample.exe,-9875"

注意 不建议注册旧的默认值,因为它需要在 Windows XP 和更高版本上与早期操作系统上使用的设置不同的设置。

AFAIK,但是,您不能为要在上下文菜单中显示的静态动词提供图标。您确实需要一个基于此的 shellIContextMenu扩展IExplorerCommand


推荐阅读