C# 注册表操作代码

1. 自定义注册表操作类

在我们编写程序时,有时会用到注册表项,我们看到的注册表是树状结构,习惯把左边树状形式叫做文件夹,右边的叫键,对应的值叫键值。但微软对注册表左边的树状称作“项”,右边我们叫键的称作数值名称(“字符串值”、“二进制值”、“DWORD(32位)值”等),相应的键值叫做数值数据。我们的代码还是以我们自己命名习惯来写的。

    #region 注册表操作类
    /// 
    /// 注册表操作类,默认基础类为HKEY_LCOAL_MACHINE
    /// 
    public static class RegistryHelper
    {
        //根据程序是32位还是64位来自动决定
        private static RegistryKey _baseKey = Registry.LocalMachine;
        //如需要指定是操作32位还是64位注册表,使用下面的语句
        //private static RegistryKey _baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

        /// 
        /// 注册表基础项
        /// 
        public static RegistryKey BaseKey { get { return _baseKey; } set { _baseKey = value; } }


        /// 
        /// 操作后返回的信息,为空表示操作正确,异常则为异常信息。
        /// 
        public static string State { get; set; } = string.Empty;

        #region 注册表目录项是否存在
        /// 
        /// 读取注册表目录项,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 目录项名称
        /// bool值,true成功,false失败,失败则查看State
        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 创建注册表目录项
        /// 
        /// 创建注册表目录项,位于BaseKey下
        /// 
        /// 目录项名称
        /// (除HKLM等基础类型外)全路径
        /// bool值,true成功,false失败,失败则查看State
        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 删除注册表目录项
        /// 
        /// 删除注册表目录项,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 目录项名称
        /// bool值,true成功,false失败,失败则查看State
        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 注册表目录下键是否存在
        /// 
        /// 读取注册表目录下键是否存在,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 子键名称
        /// bool值,true成功,false失败,失败则查看State
        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 创建、修改注册表子键
        /// 
        ///  创建、修改注册表子键,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 键的名称
        /// 键对应的值
        /// bool值,true成功,false失败,失败则查看State
        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 读取注册表子键的值
        /// 
        /// 读取注册表子键的值,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 键的名称
        /// 键对应的值,如出错,则查看State
        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 删除注册表子键
        /// 
        /// 删除注册表子键,位于BaseKey下
        /// 
        /// (除HKLM等基础类型外)全路径
        /// 键的名称
        /// bool值,true成功,false失败,失败则查看Status
        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"前面不能有斜杠。

你可能感兴趣的:(c#,开发语言)