Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用IExecuteCommand和谓词在上下文菜单外壳扩展中显示本地化文本和自定义图标?_C++_Winapi_Contextmenu_Windows Shell_Shell Extensions - Fatal编程技术网

C++ 如何使用IExecuteCommand和谓词在上下文菜单外壳扩展中显示本地化文本和自定义图标?

C++ 如何使用IExecuteCommand和谓词在上下文菜单外壳扩展中显示本地化文本和自定义图标?,c++,winapi,contextmenu,windows-shell,shell-extensions,C++,Winapi,Contextmenu,Windows Shell,Shell Extensions,我正在考虑根据新的Windows 7+方法,基于IExecuteCommand,开发上下文菜单外壳扩展,如本文所述: 而不是我更熟悉的经典IContextMenu方法 关于这种新方法,我有几个问题: 如何在自定义菜单项中显示本地化文本(例如,从资源加载)?在旧模型中,只需调用IContextMenu::QueryContextMenu实现中的InsertMenu,并传递从资源加载的字符串即可 如何将图标与自定义菜单项关联并显示?同样,这可以在旧的基于IContextMenu的模型中完成,例如调

我正在考虑根据新的Windows 7+方法,基于
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这是一个很好的观点。我