我如何使用 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)
我正在用 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)