C# 注册表操作代码

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"前面不能有斜杠。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值