C# 获取已安装程序的显示图标

C# 获取已安装程序的显示图标,c#,windows,C#,Windows,我正在尝试获取计算机上已安装软件的图标 已安装的软件列表由以下注册表路径填充: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 根据DisplayName排除重复项 现在我尝试从按键

我正在尝试获取计算机上已安装软件的图标

已安装的软件列表由以下注册表路径填充: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

根据DisplayName排除重复项

现在我尝试从按键显示图标中获取图标。如果有。 DisplayIcon中的值因软件而异。一些例子如下:

  • D:\Program Files\FileZilla FTP Client\FileZilla.exe
  • C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office安装控制器\OSETUP.DLL,1
  • D:\Program Files\Fiddler2\IE\u Toolbar.ico
  • dfshim.dll,2
  • D:\ProgramFiles\Winamp\Winamp.exe,0
  • etc\git.ico
对于所有这些示例,我可以使用图标。如果InstallLocation+DisplayIcon不是真正的源代码,我可以在InstallLocation中搜索DisplayIcon名称(例如:GetDataBackFor*的DisplayIcon是gdbnt.exe,因此我会搜索它,如果找到,我会获取他的图标)

问题在于其他应用程序(如revo或windows卸载程序)如何获取没有DisplayIcon键的应用程序的图标。它们只有根目录下的InstallLocation。他们在那个位置搜索ico或exe?如果它们是多个可执行文件,而此可执行文件的名称看起来不像DisplayName,该怎么办?如果注册表中没有这样的信息,他们如何从主可执行文件集中图标?
例如谷歌地球、苹果软件更新等。我们可以从以下位置找到有关已安装产品图标的信息 此信息与卸载一起存储在安装程序\产品密钥的注册表中-

关键字名称-HKEY_CLASSES_ROOT\Installer\Products{productID}

价值-产品图标

从这里我们可以得到已安装应用程序的图标。
更详细地说

这似乎是一个潜在的复制品。你不理解这个问题,或者我正在向巴德解释。问题是那些没有任何图标信息的程序(可执行文件,图标,InstallLocation中只有一个可执行文件)。你说得对。我误解了这个问题。:-)在您展示的示例中,它是指示的图标:对于FileZilla.exe,找到的第一个图标;对于Office,OSETUP.DLL中索引1处的图标;对于Fiddler2,它是图标文件
IE_Toolbar.ico本身;对于Winamp,它是在Winamp.exe中找到的第一个图标(索引0);最后一个是安装路径下的'etc'文件夹中的图标文件
git.ico'。确切地说,对于那些场景,我可以使用图标。但有些程序,如google earth,没有任何信息可以帮助获取注册表中的图标。无论如何,revo卸载程序和windows卸载程序可以以某种方式获取图标…我不知道如何获取。这是我获取安装程序的课程。这不是一个完美的解决方案,但时间是一个问题。也许对你有帮助。