1. 自定义注册表操作类
在我们编写程序时,有时会用到注册表项,我们看到的注册表是树状结构,习惯把左边树状形式叫做文件夹,右边的叫键,对应的值叫键值。但微软对注册表左边的树状称作“项”,右边我们叫键的称作数值名称(“字符串值”、“二进制值”、“DWORD(32位)值”等),相应的键值叫做数值数据。我们的代码还是以我们自己命名习惯来写的。
#region 注册表操作类
/// <summary>
/// 注册表操作类,默认基础类为HKEY_LCOAL_MACHINE
/// </summary>
public static class RegistryHelper
{
//根据程序是32位还是64位来自动决定
private static RegistryKey _baseKey = Registry.LocalMachine;
//如需要指定是操作32位还是64位注册表,使用下面的语句
//private static RegistryKey _baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
/// <summary>
/// 注册表基础项
/// </summary>
public static RegistryKey BaseKey { get { return _baseKey; } set { _baseKey = value; } }
/// <summary>
/// 操作后返回的信息,为空表示操作正确,异常则为异常信息。
/// </summary>
public static string State { get; set; } = string.Empty;
#region 注册表目录项是否存在
/// <summary>
/// 读取注册表目录项,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="Folder">目录项名称</param>
/// <returns>bool值,true成功,false失败,失败则查看State</returns>
public static bool IsRegistryFolderExist(string FullPath, string Folder)
{
try
{
RegistryKey OpenKey = BaseKey.OpenSubKey(FullPath);
string[] subkeyNames = OpenKey.GetSubKeyNames();
BaseKey.Close();
return subkeyNames.ToList().Exists(u => u == Folder);
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
#region 创建注册表目录项
/// <summary>
/// 创建注册表目录项,位于BaseKey下
/// </summary>
/// <param name="Folder">目录项名称</param>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <returns>bool值,true成功,false失败,失败则查看State</returns>
public static bool CreatRegistryFolder(string FullPath, string Folder)
{
try
{
RegistryKey OpenKey = BaseKey.CreateSubKey(FullPath + "\\" + Folder);
return true;
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
#region 删除注册表目录项
/// <summary>
/// 删除注册表目录项,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="Folder">目录项名称</param>
/// <returns>bool值,true成功,false失败,失败则查看State</returns>
public static bool DelRegistryFolder(string FullPath, string Folder)
{
try
{
BaseKey.DeleteSubKey(FullPath + "\\" + Folder, true); //该方法无返回值,直接调用即可
BaseKey.Close();
return true;
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
#region 注册表目录下键是否存在
/// <summary>
/// 读取注册表目录下键是否存在,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="subKeyName">子键名称</param>
/// <returns>bool值,true成功,false失败,失败则查看State</returns>
public static bool IsRegistryKeyExit(string FullPath, string subKeyName)
{
try
{
string[] subkeyNames = BaseKey.OpenSubKey(FullPath).GetValueNames();
BaseKey.Close();
return subkeyNames.ToList().Exists(u => u == subKeyName);
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
#region 创建、修改注册表子键
/// <summary>
/// 创建、修改注册表子键,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="Key">键的名称</param>
/// <param name="Value">键对应的值</param>
/// <returns>bool值,true成功,false失败,失败则查看State</returns>
public static bool CreateOrSetRegistryKey(string FullPath, string Key, object Value)
{
try
{
RegistryKey OpenKey = BaseKey.OpenSubKey(FullPath, true); //该项必须已存在
// 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
// OpenKey.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
OpenKey.SetValue(Key, Value);
BaseKey.Close();
return true;
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
#region 读取注册表子键的值
/// <summary>
/// 读取注册表子键的值,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="Key">键的名称</param>
/// <returns>键对应的值,如出错,则查看State</returns>
public static object GetRegistryKeyValue(string FullPath, string Key)
{
try
{
RegistryKey OpenKey = BaseKey.OpenSubKey(FullPath);
object keyValue = OpenKey.GetValue(Key);
OpenKey.Close();
return keyValue;
}
catch (Exception ex)
{
State = ex.Message;
return ex.Message;
}
}
#endregion
#region 删除注册表子键
/// <summary>
/// 删除注册表子键,位于BaseKey下
/// </summary>
/// <param name="FullPath">(除HKLM等基础类型外)全路径</param>
/// <param name="Key">键的名称</param>
/// <returns>bool值,true成功,false失败,失败则查看Status</returns>
public static bool DelRegistryKey(string FullPath, string Key)
{
try
{
RegistryKey OpenKey = BaseKey.OpenSubKey(FullPath, true);
OpenKey.DeleteValue(Key);
OpenKey.Close();
return true;
}
catch (Exception ex)
{
State = ex.Message;
return false;
}
}
#endregion
}
#endregion
2. 注意事项
1、此注册表操作类可以对基础键BaseKey初始化,默认为Registry.LocalMachine,即可以理解为根目录是HKEY_LOCAL_MACHINE。如果对HKEY_CURRENT_USER操作,则BaseKey = Registry.CurrentUser。
2、我们的操作系统现在多数是64位,运行32位应用程序时,它的注册表项会位于Wow6432Node下.,HKEY_LOCAL_MACHINE\SOFTWARE和HKEY_CURRENT_USER\SOFTWARE下都会有Wow6432Node节点,所以这一点要注意。当你操作注册表的程序是在Any CPU或x86下生成的,它对SOFTWARE下的注册表操作就会到Wow6432Node节点下,如果是在x64下生成,就直接在SOFTWARE下。如果是Any CPU或x86下生成的32位应用程序操作64位SOFTWARE下注册表项,需要使用 RegistryKey.OpenBaseKey方法,第一个参数为操作的基础键RegistryHive.LocalMachine或RegistryHive.CurrentUser,第二个参数为RegistryView.Registry64,也就是代码中的BaseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)。
3、在对子键值操作时要注意类型转换,代码中获取或设置子键值的类型是object,可以对应子键的类型“字符串值”、“二进制值”、“DWORD(32位)值”等。例如设置子键值为二进制,可以使用类似语句:
RegistryHelper.CreateOrSetRegistryKey("SOFTWARE\\MyAPP", "MyBin", BitConverter.GetBytes(1000))
4、代码中的参数FullPath是不能含有基础键HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER等字符串的,要从基础键之下开始,例如:FullPath = “SOFTWARE\\MyAPP”。另外注意FullPath = "\\SOFTWARE\\MyAPP"这样是错误的,程序会报异常,因为在"SOFTWARE"前面不能有斜杠。