C++ 如何使用IExecuteCommand和谓词在上下文菜单外壳扩展中显示本地化文本和自定义图标?
我正在考虑根据新的Windows 7+方法,基于C++ 如何使用IExecuteCommand和谓词在上下文菜单外壳扩展中显示本地化文本和自定义图标?,c++,winapi,contextmenu,windows-shell,shell-extensions,C++,Winapi,Contextmenu,Windows Shell,Shell Extensions,我正在考虑根据新的Windows 7+方法,基于IExecuteCommand,开发上下文菜单外壳扩展,如本文所述: 而不是我更熟悉的经典IContextMenu方法 关于这种新方法,我有几个问题: 如何在自定义菜单项中显示本地化文本(例如,从资源加载)?在旧模型中,只需调用IContextMenu::QueryContextMenu实现中的InsertMenu,并传递从资源加载的字符串即可 如何将图标与自定义菜单项关联并显示?同样,这可以在旧的基于IContextMenu的模型中完成,例如调
IExecuteCommand
,开发上下文菜单外壳扩展,如本文所述:
而不是我更熟悉的经典IContextMenu
方法
关于这种新方法,我有几个问题:
IContextMenu::QueryContextMenu
实现中的InsertMenu
,并传递从资源加载的字符串即可IContextMenu
的模型中完成,例如调用setmenuitembitmap
。菜单图标是否需要特定的图像格式IExecuteCommand
用于shell谓词,这些谓词是并且具有与其关联的“DelegateExecute”=“{clsid}”
值。静态谓词的菜单文本取自为该谓词注册的显示文本,该文本按原样显示,无法本地化,因为没有提供用于指定文本替代源的选项。只有基于IContextMenu
或IExplorerCommand
的真正shell扩展才能选择本地化文本并为其自定义谓词提供图标<代码>IExecuteCommand不提供该功能
更新:在Windows XP及更高版本上,静态谓词的显示文本是可识别的,因此您可以提供指向本地化资源的显示文本。这是记录在案的:
为Shell谓词操作字符串提供资源
当用户右键单击Windows资源管理器中的文件时,会在弹出菜单中显示某些动词的操作字符串,例如“打开”和“编辑”。应用程序不必为常见的shell谓词指定字符串,因为shell对这些谓词有自己的启用MUI的默认值但是,您应该为表示不常见动词的字符串提供可本地化的字符串资源。
在Windows XP之前的操作系统上,注册表中shell谓词的字符串使用以下语法呈现,其中谓词指定实际的谓词名称:
HKCR\<progid>\shell\<verb>
@ = <friendly-name>
在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和更高版本上使用不同于早期操作系统上使用的设置
不过,您不能为上下文菜单中显示的静态谓词提供图标。您确实需要一个基于
IContextMenu
或IExplorerCommand
的shell扩展。IExecuteCommand
用于与之关联且具有“DelegateExecute”=“{clsid}”值的shell谓词。静态谓词的菜单文本取自为该谓词注册的显示文本,该文本按原样显示,无法本地化,因为没有提供用于指定文本替代源的选项。只有基于IContextMenu
或IExplorerCommand
的真正shell扩展才能选择本地化文本并为其自定义谓词提供图标<代码>IExecuteCommand
不提供该功能
更新:在Windows XP及更高版本上,静态谓词的显示文本是可识别的,因此您可以提供指向本地化资源的显示文本。这是记录在案的:
为Shell谓词操作字符串提供资源
当用户右键单击Windows资源管理器中的文件时,会在弹出菜单中显示某些动词的操作字符串,例如“打开”和“编辑”。应用程序不必为常见的shell谓词指定字符串,因为shell对这些谓词有自己的启用MUI的默认值但是,您应该为表示不常见动词的字符串提供可本地化的字符串资源。
在Windows XP之前的操作系统上,注册表中shell谓词的字符串使用以下语法呈现,其中谓词指定实际的谓词名称:
HKCR\<progid>\shell\<verb>
@ = <friendly-name>
在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和更高版本上使用不同于早期操作系统上使用的设置
不过,您不能为上下文菜单中显示的静态谓词提供图标。您确实需要一个基于
IContextMenu
或IExplorerCommand
的shell扩展。您可以用来获取本地化标签,不是吗?如果静态标签使用了@dllpath,id语法?@JonathanPotter这是一个很好的观点。我找到了相关的文档,并相应地更新了我的答案。你可以用来获取本地化标签,不是吗?如果静态标签使用了@dllpath,id语法?@JonathanPotter这是一个很好的观点。我