5

我想将 Windows 中的文件类型与特定应用程序相关联,但我需要这样做,以便当用户打开“打开方式”菜单时,列表中应用程序的名称和图标是针对该文件类型定制的(即,不仅仅是可执行文件的名称和图标)。

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

我知道如何添加文件关联(通过在 中创建ProgIDHKEY_CLASSES_ROOT并将 ProgID 名称添加到OpenWithProgidsHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts),但我找不到任何方法来更改应用程序的名称或图标,因为它出现在“打开方式”菜单中对于该类型的文件。这可能吗?

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

4

2 回答 2

3

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

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

所以:

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

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

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

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

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

如果有更好的答案,我会暂时保留这个问题。

于 2013-05-31T08:49:04.873 回答
0

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

有关设置 ProgID的更多详细信息,请参见此处

于 2013-05-31T02:13:57.880 回答