1

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

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

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

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

这是我迄今为止尝试过的

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

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

我想避免的

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

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

4

2 回答 2

1

我想到了几件事:

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

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

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

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

HKEY_CLASSES_ROOT\.auz\(default) = auzfile
HKEY_CLASSES_ROOT\.auz\shell\open\command = C:\Path\To\App.exe
于 2009-01-09T14:52:51.423 回答
1

这是解决方案。

每种文件类型(在这种情况下假设为“.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 文档”类型的所有文件创建一个图标(我提到的“白纸 + 应用程序图标”图标)。

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

HKEY_CLASSES_ROOT\.auz\(default)

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

所以我通过简单地完全移除HKEY_CLASSES_ROOT\Foobar Document钥匙来解决这一切,

于 2009-01-12T20:11:11.030 回答