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

时间:2017-05-02 00:01:53

标签: c# regedit

我正在用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等未找到。你能帮助我哪里错了吗?感谢。

1 个答案:

答案 0 :(得分:0)

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

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将返回基于0的一个字符串的索引,如果找不到该字符串,则返回-1。它还需要一个参数,允许您进行不区分大小写的搜索(它还会搜索整个字符串以查找搜索词,而不只是搜索开头)。

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

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

对此:

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