首先,我扫描系统上的每个已安装程序。从这里我得到InstallLocation和DisplayName。 现在我想从这个名称或位置执行扫描的程序。 有没有办法做到这一点,还是我真的需要可执行文件的名称或位置?
public static class InstalledPrograms
{
const string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
public static List<string> GetInstalledPrograms()
{
var result = new List<string>();
var termsList = new List<string>();
result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry32));
result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry64));
result = result.Distinct().ToList();
result.Sort();
foreach (var i in result)
{
Console.WriteLine(i);
}
return result;
}
private static IEnumerable<string> GetInstalledProgramsFromRegistry(RegistryView registryView)
{
var result = new List<string>();
using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView).OpenSubKey(registry_key))
{
foreach (string subkey_name in key.GetSubKeyNames())
{
using (RegistryKey subkey = key.OpenSubKey(subkey_name))
{
if (IsProgramVisible(subkey))
{
var ii = (string)subkey.GetValue("InstallLocation");
result.Add(ii);
}
}
}
}
return result;
}
private static bool IsProgramVisible(RegistryKey subkey)
{
var name = (string)subkey.GetValue("DisplayName");
var releaseType = (string)subkey.GetValue("ReleaseType");
//var unistallString = (string)subkey.GetValue("UninstallString");
var systemComponent = subkey.GetValue("SystemComponent");
var parentName = (string)subkey.GetValue("ParentDisplayName");
return
!string.IsNullOrEmpty(name)
&& string.IsNullOrEmpty(releaseType)
&& string.IsNullOrEmpty(parentName)
&& (systemComponent == null);
}
}
答案 0 :(得分:1)
简短的回答是否您无法使用注册表树的该部分找到应用程序路径。该信息取决于安装。您可以找到卸载程序,因为提供了该路径。我非常怀疑您的程序用户会对您调用已安装的每个应用程序/修补程序的卸载感到满意。
您唯一能做的就是扫描这些目录中的.exe
个文件。如果你只有一个,那么你可能没问题。当然,如果使用安装程序安装它们,卸载程序很可能存在于同一目录中。
简单地启动每个已安装的应用程序都没有可预测的方法。有时,安装的对象是现有产品的库和扩展。
要考虑的另一件事是商店应用程序有关于如何安装/卸载甚至调用它们的新规则。 Windows商店应用程序没有“.exe”文件,即使您可以找到它也可以直接调用。