我如何使用 C# 查找程序列表?

How can i find programs list with C#?

我正在用 C# 编写一个小程序,我想在计算机上找到安装程序。我找到了一个例子,但它不起作用 %100

我的代码: ProgramName=CCleaner

 public static bool CheckProgram(string ProgramName)
    {
        bool status = false;
        string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";            
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                {
                    if (!string.IsNullOrEmpty(Convert.ToString(subkey.GetValue("DisplayName"))))
                    {
                        if (Convert.ToString(subkey.GetValue("DisplayName")).Contains(ProgramName))
                            status = true;
                    }
                }
            }
        }
        return status;
    }

当我 运行 我的程序找不到 "CClenear" 但是当我写 "Java" 它的工作。我确定 %100 CClenear 安装在我的电脑上。 Java,已找到 Microsoft Office、Gom Player,但未找到 Ccleaner、Spotify 等。你能帮我看看我哪里错了吗?谢谢

首先,您不妨仔细检查密钥是否存在。您可以更改代码以将所有显示名称写到一个文件中,然后在该文件中搜索您要查找的内容。以下代码会将所有非空显示名称保存到列表中,然后将该列表写入文件(如果需要,请指定不同的文件路径):

string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
List<string>displayNames = new List<string>();

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey))
{
    foreach (string subkeyName in key.GetSubKeyNames())
    {
        using (RegistryKey productKey = key.OpenSubKey(subkeyName))
        {
            var displayName = Convert.ToString(productKey.GetValue("DisplayName"));

            if (!string.IsNullOrWhiteSpace(displayName)) displayNames.Add(displayName);
        }
    }
}

var fileName = @"c:\temp\DisplayNames.txt";
File.WriteAllLines(fileName, displayNames);

现在您可以打开文本文件并找到您需要搜索的确切名称(如果它确实存在)。


另一种选择是使用 IndexOf 方法进行不区分大小写的比较。如果在另一个字符串中找到,IndexOf 将 return 一个字符串的基于 0 的索引,或者如果未找到该字符串,则 -1。它还采用一个参数,允许您进行不区分大小写的搜索(并且它还会搜索整个字符串以查找您的搜索词,而不仅仅是开头)。

您可以通过更改此行在原始代码中执行此操作:

if (Convert.ToString(subkey.GetValue("DisplayName")).Contains(ProgramName))

为此:

if (Convert.ToString(subkey.GetValue("DisplayName"))
    .IndexOf(ProgramName, StringComparison.OrdinalIgnoreCase) > -1)