【问题标题】:Document icon changes after first launch on Windows在 Windows 上首次启动后文档图标发生变化
【发布时间】:2025-11-23 00:15:01
【问题描述】:

我有一个使用 Wise 安装程序安装的应用程序(编辑:Wise 创建一个 Setup.exe 文件,而不是 MSI)。安装后,为特定文件类型设置一个图标:

HKEY_CLASSES_ROOT\.auz\DefaultIcon = C:\Path\To\App\some_icon.ico,0

然而,在安装之后,Explorer 选择使用通用的“白纸 + 应用程序图标”图标来显示此图标,这是不同的(不是我提供的)。

在首次启动时,应用程序本身会注册图标和其他文件关联,以便最后运行的版本“拥有”这些文件。此时,Explorer 会更改此文件类型的图标并显示正确的图标,但当我查看注册表时,DefaultIcon 的值完全相同

这是我目前尝试过的

  • 从注册表中删除所有条目,然后自己编写。
  • 安装后,“触摸” DefaultIcon 的值,然后启动一个只调用SHChangeNotify(SHCNE_ASSOCCHANGED) 的小程序(我的程序在更新注册表中的文件关联后执行此操作)。
  • 安装后,杀死并重新启动资源管理器。
  • 安装后,使用 TweakUI “修复”桌面上的图标。

这些都不起作用。获得正确图标的唯一方法是让程序自己安装它。我在注册表中找不到任何更改。我正在拔头发。

我想避免的事情

  • 使用其他安装软件进行测试
  • 过多地更改安装脚本(我没有 Wise 本身,因为安装程序是根据需要在另一台机器上构建的)。
  • 在可执行文件中嵌入图标。

关于如何让资源管理器在安装后显示正确的图标有什么建议吗?

【问题讨论】:

    标签: windows winapi installation icons wise


    【解决方案1】:

    我想到了几件事:

    • 为什么注册表中的图标后面有“,0”?这会将显示的图标限制为一个图标。最好有一个包含多个图标的图标文件(相同的图标 UI 但不同的大小/颜色深度) - 资源管理器具有不同的图标视图!如果您的图标文件中只有一个图标,请尝试删除“,0”。
    • 可能是在资源管理器收到更新通知之后,注册表最后写入安装程序?
    • 确保在图标文件存储在磁盘上之后写入注册表项
    • 您应该使用 Wise 安装程序自己的配置来注册文件类型。不确定,但我认为在 msi 的整个安装完成之前,资源管理器不会进行任何更改,因此手动调用 SHChangeNotify() 将无济于事。 msi 有自己的表,如果您使用正确的配置,Wise 会添加它。

    对于 Wise,请执行以下操作(而不是自己创建注册表项):

    1. 在“功能详细信息”页面组下,选择“文件关联”页面。
    2. 从当前功能下拉列表中,选择核心。
    3. 单击窗口右侧的添加并选择新建。 将出现“文件关联详细信息”对话框。
    4. 单击“扩展详细信息”选项卡。
    5. 浏览到 QuickFacts 目录,选择文件 QckFacts.exe,然后单击确定。
    6. 在扩展中,输入:qft
    7. 保留其余字段的默认值,然后单击“确定”。 扩展名 .QFT 已添加到安装中。当最终用户双击 目标计算机上具有此扩展名的文件,QuickFacts 应用程序 启动。
    8. 保存安装

    [编辑] 您可能还缺少必需的注册表项(该图标可能不足以让 shell 显示它):

    HKEY_CLASSES_ROOT\.auz\(default) = auzfile
    HKEY_CLASSES_ROOT\.auz\shell\open\command = C:\Path\To\App.exe
    

    【讨论】:

    • 斯特凡,感谢您的意见。 “,0”似乎不是我的问题的一部分,因为软件会写它,并且它可以工作。安装后通知 Explorer 也无济于事,因此假设 2 和 3 似乎也是错误的。但好点。
    【解决方案2】:

    这是解决方案。

    每种文件类型(在这种情况下假设为“.auz”)都注册到:

    • 带有图标资源路径的DefaultIcon 键,以及
    • HKEY_CLASSES_ROOT\.auz\(default) 的值给出文件类型的描述,例如“Foobar 文档”。

    除此之外,还有一个“Foobar Document”文档类型的条目,或者更具体地说,是如何从 shell 打开此类文档的键:

    HKEY_CLASSES_ROOT\Foobar Document\Shell\command\open\(default) = C:\Path\To\App.exe "%1"
    

    显然,此键取代了为特定文件扩展名写入的值。因为图标在 .exe 文件的外部,所以 Windows 资源管理器使用应用程序的第一个图标为所有类型为“Foobar Document”的文件创建一个图标(我提到的那个“白纸 + 应用程序图标”图标)。

    现在,我错的是应用程序本身确实改变了

    HKEY_CLASSES_ROOT\.auz\(default)
    

    开始时设置一个稍微不同的值,比如“Foobar 1.2 Document”(不是 DRY 的问题)。因此,“Foobar 文档”的链接丢失了,.auz 文件在第一次启动后获得了它们的图标。

    所以我通过完全删除 HKEY_CLASSES_ROOT\Foobar Document 键来解决这一切,

    【讨论】:

      最近更新 更多