我将创建另一个应用程序(称为VersionTracker)来获取已安装应用程序的版本。因此,如果我传递名称“MyApp”,我想获得版本号“5.6”。如果系统中安装了另一个应用程序Adobe Reader,则在传递“Adobe Reader”时,我希望能够获取Adobe Reader的版本号。
我需要知道如何构建“VersionTracker”。
第一而且最重要的是,并不是所有应用程序都在系统中保存它们的版本信息。说实话,只有极少数的应用程序这样做。你应该查找的地方是Windows注册表。大多数已安装的应用程序将它们的安装数据放置在以下位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
然而,事情并不那么简单 - 在64位版本的Windows系统中,32位(x86)应用程序将它们的安装数据存储在另一个键里面:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
在这些键中有很多键,其中一些具有“易于阅读”的名称,例如Google Chrome
,而另一些具有诸如{63E5CDBF-8214-4F03-84F8-CD3CE48639AD}
之类的名称。您必须将所有这些键解析到您的应用程序中,并开始查找应用程序名称。它们通常在DisplayName
值中,但并非总是如此。应用程序的版本通常在DisplayVersion
值中,但有些安装程序确实使用其他值,例如Inno Setup: Setup Version
等。有些应用程序在其名称中写有其版本,因此可能应用程序版本已经包含在DisplayName
值中。
注意:解析所有这些注册表键和值并“选择”正确的值并不容易。并非所有安装程序都将应用程序数据保存到这些键中,有些安装程序不会在那里保存应用程序版本等。但是,通常应用程序使用这些注册表键。[来源:StackOverflow:通过注册表检测已安装的程序,浏览我的注册表]
现在,当您知道应该查找的位置时,您必须在C#中编写程序。我不会为您编写应用程序,但我会告诉您应该使用哪些类以及如何使用它们。首先,您需要使用这些:
using System;
using Microsoft.Win32;
要访问你的 HKEY_LOCAL_MACHINE
,需要创建一个像这样的 RegistryKey
:
RegistryKey baseRegistryKey = Registry.LocalMachine;
现在你需要定义子密钥:
string subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// or "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
现在你需要进入子键,所以创建一个新的 RegistryKey
:
RegistryKey uninstallKey = baseRegistryKey.OpenSubKey(subKey);
现在您需要遍历所有子键, 所以首先我们获取所有子键的名称:
string[] allApplications = uninstallKey.GetSubKeyNames();
现在你必须自己逐个遍历所有的子键,通过创建一个新的注册表键(你不必这样做,但我会这样做):
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + applicationSubKeyName);
这里的applicationSubKeyName
是你正在检查的子键的名称。我建议使用foreach
语句,它可以帮助你(但前提是你有一些C#的经验,我不会在这里告诉你如何使用foreach
)。
现在检查应用程序的名称并将其与所需应用程序的名称进行比较(你不能依赖于子键的名称,因为,如我所说,它们可能被称为例如{63E5CDBF-8214-4F03-84F8-CD3CE48639AD}
,所以你必须在这里检查名称):
string appName = (string)appKey.GetValue("DisplayName");
如果这是正确的应用程序(必须自己检查),找到版本:
string appVersion = (string)appKey.GetValue("DisplayVersion");
完成了,您现在已经有了版本。至少有60-80%的几率...
记住! 如果某个关键字或值不存在,则该方法返回null
。请记得每次检查返回的值是否为null,否则您的应用程序将崩溃。
想获取更多信息?Code Project: 使用C#读取、写入和删除注册表
我真的希望我能帮到您。如果您想了解其他内容,但我没有理解您的问题,请下次提问更好的问题。 :)
///
/// Author : Muhammed Rauf K
/// Date : 03/07/2011
/// A Simple console application to create and display registry sub keys
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// it's required for reading/writing into the registry:
using Microsoft.Win32;
namespace InstallationInfoConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Registry Information ver 1.0");
Console.WriteLine("----------------------------");
Console.Write("Input application name to get the version info. (for example 'Nokia PC Suite'): ");
string nameToSearch = Console.ReadLine();
GetVersion(nameToSearch);
Console.WriteLine("----------------------------");
Console.ReadKey();
}
///
/// Author : Muhammed Rauf K
/// Date : 03/07/2011
/// Create registry items
///
static void Create()
{
try
{
Console.WriteLine("Creating registry...");
// Create a subkey named Test9999 under HKEY_CURRENT_USER.
string subKey;
Console.Write("Input registry sub key :");
subKey = Console.ReadLine();
RegistryKey testKey = Registry.CurrentUser.CreateSubKey(subKey);
Console.WriteLine("Created sub key {0}", subKey);
Console.WriteLine();
// Create two subkeys under HKEY_CURRENT_USER\Test9999. The
// keys are disposed when execution exits the using statement.
Console.Write("Input registry sub key 1:");
subKey = Console.ReadLine();
using (RegistryKey testKey1 = testKey.CreateSubKey(subKey))
{
testKey1.SetValue("name", "Justin");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static void GetVersion(string nameToSearch)
{
// Get HKEY_LOCAL_MACHINE
RegistryKey baseRegistryKey = Registry.LocalMachine;
// If 32-bit OS
string subKey
//= "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// If 64-bit OS
= "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
RegistryKey unistallKey = baseRegistryKey.OpenSubKey(subKey);
string[] allApplications = unistallKey.GetSubKeyNames();
foreach (string s in allApplications)
{
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + s);
string appName = (string)appKey.GetValue("DisplayName");
if(appName==nameToSearch)
{
string appVersion = (string)appKey.GetValue("DisplayVersion");
Console.WriteLine("Name:{0}, Version{1}", appName, appVersion);
break;
}
}
}
static void ListAll()
{
// Get HKEY_LOCAL_MACHINE
RegistryKey baseRegistryKey = Registry.LocalMachine;
// If 32-bit OS
string subKey
//= "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// If 64-bit OS
= "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
RegistryKey unistallKey = baseRegistryKey.OpenSubKey(subKey);
string[] allApplications = unistallKey.GetSubKeyNames();
foreach (string s in allApplications)
{
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + s);
string appName = (string)appKey.GetValue("DisplayName");
string appVersion = (string)appKey.GetValue("DisplayVersion");
Console.WriteLine("Name:{0}, Version{1}", appName, appVersion);
}
}
}
}
下面的代码基于类似解决方案对我有效:
var version = GetApplicationVersion("Windows Application Driver");
string GetApplicationVersion(string appName)
{
string displayName;
// search in: CurrentUser
var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (var keyName in key.GetSubKeyNames())
{
var subKey = key.OpenSubKey(keyName);
displayName = subKey.GetValue("DisplayName") as string;
if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
return subKey.GetValue("DisplayVersion").ToString();
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (var keyName in key.GetSubKeyNames())
{
var subKey = key.OpenSubKey(keyName);
displayName = subKey.GetValue("DisplayName") as string;
if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
return subKey.GetValue("DisplayVersion").ToString();
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (var keyName in key.GetSubKeyNames())
{
var subKey = key.OpenSubKey(keyName);
displayName = subKey.GetValue("DisplayName") as string;
if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
return subKey.GetValue("DisplayVersion").ToString();
}
// NOT FOUND
return null;
}