Windows:更改与文件types关联的应用程序的名称/图标

我想将Windows中的文件types与特定的应用程序关联起来,但是当用户打开“打开方式”菜单时,需要将该文件types与列表中的应用程序的名称和图标进行自定义即不是简单的可执行文件的名称和图标)。

这是因为二进制文件是一个普通的二进制文件,它运行许多不同的应用程序,具体取决于它的命令行参数(类似于python.exejavaws.exe )。 我不希望“Open With”菜单显示“Python”或“Java”,我希望它显示在命令行上传递的应用程序的名称和图标。

我知道如何添加文件关联(通过在HKEY_CLASSES_ROOT创buildProgID ,并将ProgID名称添加到OpenWithProgids或HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts ),但我找不到任何方法来更改名称或应用程序的图标显示在“打开方式”菜单中,以显示该types的文件。 这可能吗?

编辑澄清我对添加文件关联的现有理解。)

我有一个部分解决方案,允许设置名称(但不是图标或公司名称)。

可以在Windows中注册一个应用程序 。 这与创建ProgID非常相似,但它允许您设置FriendlyAppName 。 出于某种原因,您不能设置一个ProgID FriendlyAppName。 不幸的是, FriendlyAppName不是一个字符串,而是一个.DLL或.EXE文件中对资源的引用。 去搞清楚。

所以:

  • 为要与其关联文件的虚拟应用程序创建一个虚拟.dll文件。 它没有任何代码,只是资源。 给它一个包含应用程序标题的字符串资源。
  • 创建一个关键HKEY_CLASSES_ROOT\Applications\whatever.exe (任何应该是虚拟应用程序特有的唯一名称 – 它不需要是真正的可执行文件的名称,但它需要以.exe或其他可执行文件扩展名)。
    • 设置默认值DefaultIconshell ,如程序标识符中所述 。 这将设置文件类型的名称和图标,当该关联是默认的时候,以及要运行的shell命令。
    • 同时给它一个指向虚拟.dll的FriendlyAppName值。 例如,如果您的应用程序名称字符串是字符串编号23,请将FriendlyAppName设置为“@PATH \ TO \ DLL.dll,-23”。
    • 添加SupportedTypes键并为虚拟应用程序可以处理的每个类型添加一个值。

现在应用程序将出现在“选择默认程序”对话框的“其他程序”下拉列表中,但不出现在“打开方式”菜单中。 要正确地关联它,你需要:

  • 转到注册表中的文件扩展名的条目。 这应该在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts (它也可以在HKEY_CURRENT_USER ,但我发现FileExts版本覆盖,如果用户手动创建一个文件关联,Windows创建一个最好使用那个)。
    • OpenWithList下 ,需要为上面创建的假whatever.exe创建一个条目。 这应该是一个值,其名称是一个任意的字母,其值是假的EXE名称。
    • 同样在OpenWithList下,您需要确保MRUList值包括您在上一步中分配给伪造可执行文件的字母。
    • 我不相信你需要将它添加到OpenWithProgids (它没有这个工作),但文档告诉你。
    • 要使其成为默认处理程序,在UserChoice下,将Progid设置为“ Applications\whatever.exe ”。 这是可选的,但是这里需要设置一些东西(如果UserChoice丢失,没有任何工作)。

最后,用SHChangeNotify命令来刷新Windows的图标和快捷方式缓存。 (我不确定这是否是必要的;我只是注意到它有助于使Windows注意到您所做的更改。)

现在在文件类型的“打开方式”菜单上,您应该看到一个条目,用于放入虚拟.dll文件中的自定义字符串。 它仍然会有shell命令中提到的真正的二进制图标,但至少可以控制名称。 为什么这么难?

如果有更好的答案,我会把这个问题放一会儿。

这有点复杂,但基本上你需要创建一个ProgID来引用应用程序本身,然后在扩展中添加一个OpenWithProgIDs键。

关于设置ProgID的更多细节在这里 。