c++ - 如何使用 IExecuteCommand 和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?
问题描述
我正在考虑按照基于 的新 Windows 7+ 方法开发上下文菜单 shell 扩展IExecuteCommand
,如本文所述:
IContextMenu
而不是我更熟悉的经典方法。
我对这种新方法有几个问题:
如何在自定义菜单项中显示本地化文本(例如,从资源加载)?在旧模型中,这可以简单地
InsertMenu
在IContextMenu::QueryContextMenu
实现中调用,并传递从资源加载的字符串。如何将图标与我的自定义菜单项关联并显示?同样,这可以在
IContextMenu
基于 old 的模型中完成,例如调用SetMenuItemBitmaps
. 菜单图标是否需要特定的图像格式?
解决方案
IExecuteCommand
用于在注册表中静态注册并具有"DelegateExecute"="{clsid}"
与之关联的值的外壳动词。静态动词的菜单文本取自为动词注册的显示文本,并且该文本按原样显示,无法本地化,因为根本没有提供选项来指定文本的替代来源。只有真正的 shell 扩展基于。IContextMenu
或IExplorerCommand
可以选择本地化文本并为其自定义动词提供图标。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
。
推荐阅读
- graphql - 在 AWS AppSync 中访问 json 数组
- ruby-on-rails - 如何在 Rails 中启动 MidiSmtpServer
- html - 使用 prev next 滑块在中心获取轮播图像
- python - 用两个字符串制作一个情节
- three.js - ARAME/THREE 将物体放置在相机前面时考虑相机旋转
- c# - 如何使用具有字符串 [] 数组属性的 LINQ 实体进行搜索并找到这些包含字符串 [] 数组中的任何字符串的实体?
- git - 有没有更好的方法来提交到 Git 父分支并合并到当前分支?
- reactjs - 更改旧的 React 应用程序以使用 React 开发工具
- web - 剖析典型 Java Web 应用程序
- c# - 当加密没有 IV(初始化向量)时,C# 中的 AES 解密