【发布时间】:2021-07-09 02:55:04
【问题描述】:
我阅读了很多获取程序的信息。没有一种算法能做到我想要的。我需要像在控制面板中一样完全安装程序。
所以我用了:
- WMI
Win32_Product类。它仅显示 msi 安装的程序。 - 注册表项。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。同样,控制面板中不显示某些程序,控制面板中显示的某些程序不在此注册表节点中。
那么,这个世界上有没有人知道哪个算法使用控制面板来显示已安装的程序?
UPD1:是的,我使用 64 位,我知道还有另一个节点用于 64 位安装程序“HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”,但以下代码枚举了两次 HKLM\SOFTWARE\Wow6432Node\Microsoft \Windows\CurrentVersion\Uninstall 部分,奇怪...
var 程序 = 新列表(); string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 使用(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) { foreach(key.GetSubKeyNames() 中的字符串 subkey_name) { 使用 (RegistryKey subkey = key.OpenSubKey(subkey_name)) { var name = (string)subkey.GetValue("DisplayName"); if(!string.IsNullOrEmpty(name)) { 程序。添加(名称); } } } } registry_key = @"软件\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; 使用(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) { foreach(key.GetSubKeyNames() 中的字符串 subkey_name) { 使用 (RegistryKey subkey = key.OpenSubKey(subkey_name)) { var name = (string)subkey.GetValue("DisplayName"); if (!string.IsNullOrEmpty(name)) { 程序。添加(名称); } } } } foreach(programs.OrderBy(x => x)中的var程序) { Console.WriteLine(程序); }【问题讨论】:
-
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall应该这样做。您能否举一个出现在控制面板中但不在此 reg 键中的程序示例? -
您使用的是 64 位机器吗?
-
我更新了主题,以下代码没有显示我在 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 节点中的 winrar 程序
-
您运行的是 32 位进程吗?如果是这样,您需要使用
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)而不是Registry.LocalMachine来从 64 位密钥中获取条目。 -
@RichardDeeming,太棒了!但是 displayig windows 更新和修补程序仍然存在问题。我认为有一些关键定义该程序是更新公关修补程序。有什么想法吗?
标签: c# .net windows registry controlpanel