在 Windows 10 中更改受保护文件扩展名的图标

Mik*_*ike 7 windows-registry icons windows-explorer file-extension windows-10

目标是让 .jpg、.png、.tif 和 .raw 文件始终使用 Photoshop CC 2015 打开并使用相应的图标。

例子

您可以参考下面的流程图,了解 Windows 10 如何为文件选择图标。我通过在注册表中进行更改并观察结果来提出这一点。

(点击放大) 手推车

问题

  • 如果扩展名与文件类型相关联,则由扩展名键定义的默认图标将被忽略。
  • UserChoice键值定义ProgId的文件类型覆盖扩展键定义的文件类型。
  • UserChoiceProgId的值设置为Application/Photoshop.exe设置Photoshop中为常开,以应用为.JPG和.PNG时。
  • 由于新的哈希安全性,无法更改UserChoice键值ProgId
  • 无法删除UserChoice.jpg 和 .png 等受保护扩展名的密钥

问题/可能的解决方案

  1. 有没有办法覆盖扩展级别上文件类型定义的图标?
  2. 有没有办法覆盖UserChoice扩展级别上的键定义的文件类型?
  3. 什么决定了在 GUI 中设置 always-open-with 应用程序时将设置的UserChoice键值是什么ProgId,为什么 .tif 导致Photoshop.TIFFFile.90而 .png 和 .jpg 导致Application/Photoshop.exe.
  4. 有没有办法生成密钥所需的散列UserChoice
  5. 有没有办法阻止 Windows 检查/要求UserChoice密钥哈希?
  6. 有没有办法Photoshop.JPEGFile.90使用 GUI将文件类型指定为始终打开的应用程序?
  7. 有没有办法阻止 Windows 保护/重新创建UserChoice密钥?

笔记

直到 explorer.exe 重新启动/刷新后,注册表更改才会生效。您可以使用任务管理器杀死并重新启动 explorer.exe,或者您可以使用DesktopRefresh.exe

UserChoice键可在两个地方存在:

  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jpg\UserChoice
  • HKCU\SOFTWARE\Microsoft\Windows\Roaming\OpenWith\FileExts\.jpg\UserChoice

如果一个不存在,则使用另一个。因此,如果要进行更改,请确保删除/修改它们。

示例键:

  • 扩展键: HKCR\.jpg
  • 文件类型键: HKCR\Photoshop.JPEGFile.90
  • UserChoice 钥匙: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jpg\UserChoice

细节

首次安装 Photoshop 时,它关联了所有文件扩展名,一切都很棒。在某个时候,我决定始终使用照片应用程序打开 .png、.jpg、.tif 和 .raw 文件。所以我:右键单击 .png/.jpg/.tif/.raw 文件 -> 打开方式 -> 选择另一个应用程序 -> 选择照片 -> 选中“始终使用此应用程序打开 .png 文件”。现在我想回到用 Photoshop 打开。我和以前一样,选择 Photoshop 作为始终使用的应用程序。现在可以使用 Photoshop 打开 .jpg、.png、.tif 和 .raw 文件。但是,.tif 文件显示正确的图标,而 .jpg、.png 和 .raw 显示 Photoshop.exe 图标。

我尝试重新安装 Photoshop,但这没有帮助。我尝试使用 Adob​​e Bridge 重置文件关联,但这也无济于事。文件类型管理器和默认程序编辑器等工具不起作用(我将在下面解释原因)。

然后我开始研究 Windows 10 如何为给定文件选择显示哪个图标。我学会了:

  1. 如果扩展名与文件类型相关联,则使用由该文件类型键定义的图标。否则,使用扩展键定义的图标。
  2. 扩展名可以通过两种方式与文件类型相关联:如果为扩展名设置了始终打开的程序/应用程序,则该程序/应用程序用作扩展名的文件类型。否则,可以通过扩展键定义文件类型。

就我而言,.jpg、.png、.tif、.raw 将 Photoshop 设置为始终打开的应用程序。这通过注册表反映在

  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jpg\UserChoice
  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.png\UserChoice
  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice
  • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.raw\UserChoice

键。这就是 .tif 和 .jpg/.png/.raw 之间的区别所在。.tif 的ProgId值是Photoshop.TIFFFile.90.jpg、.png 和 .raw的值Applications\Photoshop.exe。这意味着 .tif 与Photoshop.TIFFFile.90文件类型正确关联,但 .jpg .png 和 .raw 与文件类型关联Applications\Photoshop.exe

我不能简单地更改Applications\Photoshop.exe文件类型的图标,因为 .jpg、.png 和 .raw 都使用该文件类型。因此,3 个扩展使用相同的图标。我无法为每个扩展指定唯一的图标。这就是文件类型管理器和默认程序编辑器工具不起作用的原因。在这种情况下,他们为文件类型设置了 DefaultIcon。

解决办法似乎很简单:改变ProgId在价值UserChoice键使用Photoshop.JPEGFile.90Photoshop.PNGFile.90以及Photoshop.RAWFile.90文件类型。这在 Windows 10 中不再可能。新的安全措施添加了密钥中Hash伴随ProgId值的值UserChoice。只有 Windows 知道如何生成这个哈希。如果该值的哈希值不正确ProgId,Windows 将重置/删除该UserChoice密钥。这使得该值只能通过 Windows GUI 设置。这个想法是为了防止病毒/攻击者能够以编程方式更改始终打开的应用程序的扩展。

我不知道为什么选择 Photoshop 作为始终打开的应用程序会导致正确ProgId设置为 .tif 而不是 .jpg、.png 和 .raw,但似乎无法修复。在这一点上,我开始查看其他我没有接触过的扩展名,比如 .tga。我从未为 .tga 设置始终打开的应用程序,因此它没有UserChoice密钥。相反,.tga 的扩展键定义了关联类型,如下所示:

[HKCR\.tga]
@="Photoshop.TGAFile.90"
Run Code Online (Sandbox Code Playgroud)

另一个看似简单的解决方案:通过删除UserChoice密钥并在扩展密钥上定义文件类型来取消设置始终打开的应用程序。这适用于 .raw,但不适用于 .jpg 和 .png。当我删除UserChoice.jpg 和 .png的键时,我收到了一条带有此错误的 Windows 通知:

应用默认值已重置

应用程序导致 .jpg 文件的默认应用程序设置出现问题,因此已将其重置为“照片”

我刷新了注册表,果然,UserChoice密钥又回来了。事实证明,Windows 会保护一些扩展名(如 .jpg 和 .png),并且不允许您删除UserChoice密钥。

所以我们不能删除UserChoice密钥,我们不能更新UserChoice.ProgId到正确的值,我们不能覆盖指定的文件类型UserChoice.ProgId……现在怎么办?

Mik*_*ike 3

我找到了一个 hacky 解决方法,但我仍然想得到上面问题的答案,这样我们就可以找到一个合适的/不那么 hacky 的解决方案。

\n\n

下面是对初学者友好的分步操作。

\n\n

创建一个虚拟 .cmd 文件,并将其设置为使用 GUI 的扩展的始终打开应用程序。这会导致 Windows 为虚拟 .cmd“app”创建新文件类型,并通过设置键值(例如: )将其与扩展名UserChoice关联ProdId起来Application/customJPEG.cmd。使用唯一命名的虚拟 .cmd 文件对每个扩展重复此过程,然后,bam,我们就有了与每个扩展关联的唯一文件类型(例如:Application/customJPEG.cmdApplication/customPNG.cmd等)。然后,我们可以为每种新文件类型独立定制图标和打开/编辑命令。

\n\n

有关 Windows 如何选择文件图标的更多信息,请参阅原始问题中的流程图。

\n\n

注意:只有 .jpg 和 .png 等受保护的扩展名才需要此解决方法。请参阅我上面的问题,了解不受保护的扩展的解决方案。但是,无论如何,此解决方法应该适用于任何扩展。

\n\n


\n\n
\n\n

快速词汇:

\n\n
    \n
  • 文件扩展名:文件名中最后一个点后面的内容。.jpg、.jpeg、.png 等都是不同的文件扩展名。
  • \n
  • 文件类型:文件分类/类别。可能与一个或多个文件扩展名相关联。例如,JPEG 文件类型可能与 .jpg 和 .jpeg 文件扩展名相关联。
  • \n
\n\n

注意:图像文件扩展名(例如 .jpg 和 .png)显示图像的缩略图。要查看该图标,请创建一个空文件(因此无法生成缩略图)或打开资源管理器窗口并将“视图”设置为“详细信息”。

\n\n

注意:在刷新桌面之前,您不会看到任何更改。确保在更改注册表后执行此操作。详细信息请参见步骤 6。

\n\n

注意:如果注册表中似乎缺少某个键,请尝试按 F5 或“查看”->“刷新”来刷新。regedit 不会保持最新状态,需要刷新才能看到最新版本。

\n\n
\n\n

对每个文件扩展名重复以下步骤。将 .jpg 替换为您的文件扩展名,并将 Photoshop 替换为您想要的任何应用程序。

\n\n

1. 创建一个虚拟的 .cmd 文件

\n\n
    \n
  1. 打开记事本
  2. \n
  3. 您可以将该文件留空
  4. \n
  5. 文件->另存为
  6. \n
  7. 使用类似于customJEPG.cmd文件名的内容并保存
  8. \n
\n\n

无论您将其保存在何处或命名为什么,每个文件类型的名称都必须不同。虚拟 .cmd 的名称将决定文件类型的名称。我建议在名称中包含扩展名或文件类型,以便以后轻松区分。

\n\n

2. 将虚拟 .cmd 文件设置为始终打开的应用程序

\n\n
    \n
  1. 右键单击 .jpg 文件
  2. \n
  3. 打开方式->选择另一个应用程序
  4. \n
  5. 确保选中“始终使用此应用程序打开 .jpg 文件”
  6. \n
  7. 滚动到底部并单击“更多应用\xe2\x86\x93”
  8. \n
  9. 再次滚动到底部,然后单击“在此电脑上查找其他应用程序”
  10. \n
  11. 浏览并选择您的虚拟 .cmd 文件
  12. \n
  13. 忽略并关闭“此应用程序无法在您的电脑上运行”错误
  14. \n
  15. 如果“您想如何打开此文件?” 窗口再次弹出,确保您的虚拟 .cmd 文件在顶部的“继续使用此应用程序”下仍处于选中状态,选中“始终使用此应用程序打开 .jpg 文件”,然后单击“确定”。
  16. \n
\n\n

如果您希望多个文件扩展名共享同一文件类型,请对每个扩展名重复上述步骤 1-7。

\n\n

3. 获取新的关联文件类型

\n\n
    \n
  1. 打开注册表
  2. \n
  3. 导航至:
    \nHKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.jpg\\UserChoice
  4. \n
  5. 复制/写下 的值ProgId。这是现在与 .jpg 扩展名关联的文件类型
  6. \n
\n\n

文件类型应该是Applications\\{the name of your dummy .cmd}. 例子:Applications\\customJPEG.cmd

\n\n

4.更新文件类型以使用正确的图标

\n\n
    \n
  1. 在注册表中,导航至HKEY_CLASSES_ROOT\\
  2. \n
  3. 现在打开与您的文件类型同名的密钥。例如,如果您的文件类型是Applications\\customJEPG.cmd,您将打开:
    \nHKEY_CLASSES_ROOT\\Applications\\customJEPG.cmd
  4. \n
  5. 在里面创建一个名为的新密钥DefaultIcon
  6. \n
  7. 将键的(默认)值设置DefaultIcon为您要使用的图标的路径。示例:
    \nE:\\Tools\\Adobe\\Adobe Photoshop CC 2015\\Photoshop.exe,30
  8. \n
\n\n

5. 更新文件类型以使用 Photoshop 打开和编辑

\n\n
    \n
  1. 打开shell\\open\\command文件类型密钥内的密钥。示例:
    \nHKEY_CLASSES_ROOT\\Applications\\customJEPG.cmd\\shell\\open\\command
  2. \n
  3. 编辑(默认)值,使其指向 Photoshop.exe 而不是虚拟 .cmd 文件。示例:
    \n"E:\\Tools\\Adobe\\Adobe Photoshop CC 2015\\Photoshop.exe" "%1"
  4. \n
  5. 如果密钥不存在,则在密钥edit\\command内创建该密钥。shell示例:
    \nHKEY_CLASSES_ROOT\\Applications\\customJEPG.cmd\\shell\\edit\\command
  6. \n
  7. 编辑(默认)值,使其与您的open\\command密钥具有相同的值。示例:
    \n"E:\\Tools\\Adobe\\Adobe Photoshop CC 2015\\Photoshop.exe" "%1"
  8. \n
\n\n

6.刷新桌面

\n\n

在刷新桌面之前,您不会看到任何变化。有 3 种方法可以做到这一点:

\n\n
    \n
  • 在 Windows 10 中运行ie4uinit.exe -show. 在 Windows 7 和 8 中运行ie4uinit.exe -ClearIconCache. (感谢@Tony的提示。)
  • \n
  • 或者,您可以简单地下载并运行DesktopRefresh.exe
  • \n
  • 或者,您可以重新启动 explorer.exe:

    \n\n
      \n
    1. 打开任务管理器(ctrl+shift+esc)
    2. \n
    3. 转到详细信息选项卡并找到explorer.exe
    4. \n
    5. 右键单击explorer.exe->结束任务,然后单击结束进程
    6. \n
    7. 仍在任务管理器中转到“文件”->“运行新任务”
    8. \n
    9. 输入explorer.exe并点击确定
    10. \n
  • \n
\n\n

7. 测试一下

\n\n
    \n
  1. 现在应该为 .jpg 文件显示正确的图标。
  2. \n
  3. 双击 .jpg 文件应在 Photoshop 中将其打开。
  4. \n
  5. 右键单击 .jpg 文件 -> 编辑应在 Photoshop 中将其打开。
  6. \n
\n\n

如果“您想如何打开此文件?” 窗口再次弹出,确保您的虚拟 .cmd 文件在顶部的“继续使用此应用程序”下仍处于选中状态,选中“始终使用此应用程序打开 .jpg 文件”,然后单击“确定”。

\n\n

8.删除虚拟.cmd

\n\n

您可以删除虚拟 .cmd 文件。这是可选的。

\n\n
\n\n

关于查找图标的说明

\n\n

通常,应用程序的 .exe 将包含多个图标。例如,Photoshop.exe 包含它支持的所有不同文件类型的所有图标。以下是查找和使用这些图标的方法:

\n\n
    \n
  1. 右键单击并选择创建快捷方式,创建 .exe 的快捷方式
  2. \n
  3. 右键单击快捷方式并选择属性
  4. \n
  5. 单击底部附近的更改图标按钮
  6. \n
  7. 您现在将看到这样的窗口(但没有数字):
    \n图标窗口
  8. \n
  9. 图标从 0 开始编号。找到您要使用的图标的编号。您可以使用公式来代替计数(column - 1) * 4 + row - 1。例如,如果图标位于第 3 行第 6 列,(6 - 1) * 4 + 3 - 1 = 22
  10. \n
  11. 现在,您可以通过在 .exe 路径中包含数字来引用该图标,如下所示:
    \nC:\\Example\\Photoshop.exe,23
  12. \n
\n