C#操作注册表

一.注册表巢

     在注册表中,最上面的节点是注册表巢(registry hive)。

     HKEY_CLASSES_ROOT(HKCR)    包含系统文件类型的细节,以及应用程序可以打开的文件类型,它还包含所有COM组件的注册信息。

     HKEY_CURRENT_USER(HKCU)    包含用户目前登陆的机器的用户配置,包括桌面设置、环境变量、网络和打印机连接和其他定义用户操作环境的变量。

     HKEY_LOCAL_MACHINE(HKLM)    是一个很大的巢,其中包含所有安装到机器上的软件和硬件的信息。

     HKEY_USERS(HKUSR)                包含所有用户的用户配置。

     HKEY_CURRENT_CONFIG(HKCF)  包含机器上硬件的信息。

二.注册表类及常用属性和函数

using Microsoft.Win32;
这个命名空间包含了注册表相关的类。Registry类、RegistryKey类。
Registry类封装了注册表的七个基本主键:
Registry.ClassesRoot
对应于HKEY_CLASSES_ROOT主键 
Registry.CurrentUser
对应于HKEY_CURRENT_USER主键
Registry.LocalMachine
对应于 HKEY_LOCAL_MACHINE主键
Registry.User
对应于 HKEY_USER主键
Registry.CurrentConfig
对应于HEKY_CURRENT_CONFIG主键
Registry.DynDa 
对应于HKEY_DYN_DATA主键
Registry.PerformanceData
对应于HKEY_PERFORMANCE_DATA主键

















RegistryKey类封装了对注册表的基本操作。包括读、写、删等操作的常用函数: 
Name 键的名称(只读)
SubKeyCount 键的子键个数
ValueCount 键包含的值的个数
Close() 关闭键
CreateSubKey() 创建给定名称的子键
DeleteSubKey() 删除指定的子键
DeleteSubKeyTree() 递归删除子键及其所有的子键
DeleteValue() 从键中删除一个指定的值
GetAccessControl() 返回指定注册表键的访问控制表
GetSubKeyNames() 返回包含子键名称的字符串数组
GetValue() 返回指定的值
GetValueKind() 返回指定的值,检索其注册表数据类型
GetValueNames() 返回一个包含所有键值名称的字符串数组
OpenSubKey() 返回表示给定子键的RegistryKey实例引用
SetAccessControl() 把访问控制表(ACL)应用于指定的注册表键
SetValue() 设置指定的值

            






















三 注册表项的创建、打开、删除
1,创建
 //使用CreateSubKey()在SOFTWARE下创建子项test
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.CreateSubKey(@"SOFTWARE	est");
hklm.Close();
hkSoftWare.Close();
 

       2,打开

//使用OpenSubKey()打开项,获得RegistryKey对象,当路径不存在时,为Null。第二个参数为true,表示可写,可读,可删;省略时只能读。
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE	est",true);
hklm.Close();
hkSoftWare.Close();

      3,删除

//主要用到了DeleteSubKey(),删除test项
RegistryKey hklm = Registry.LocalMachine;
hklm.DeleteSubKey(@"SOFTWARE	est", true);  //为true时,删除的注册表不存在时抛出异常;当为false时不抛出异常。
hklm.Close();

四、注册表键值的创建、打开和删除

      1,创建

//主要用到了SetValue(),表示在test下创建名称为Name,值为RegistryTest的键值。第三个参数表示键值类型,省略时,默认为字符串
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE	est",true);
hkSoftWare.SetValue("Name", "RegistryTest", RegistryValueKind.String);
hklm.Close();
hkSoftWare.Close();

     2,打开

//主要用到了GetValue(),获得名称为"Name"的键值
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE	est", true);
string sValue = hkSoftWare.GetValue("Name").ToString();
hklm.Close();
hkSoftWare.Close();

     3,删除

//主要用到了DeleteValue(),表示删除名称为"Name"的键值,第二个参数表示是否抛出异常
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE	est", true);
hkSoftWare.DeleteValue("Name", true);
hklm.Close();
hkSoftWare.Close();

五、判断注册表项、注册表键值是否存在

        //判断注册表项是否存在
        private bool IsRegistryKeyExist(string sKeyName)
        {
            string[] sKeyNameColl;
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE");
            sKeyNameColl = hkSoftWare.GetSubKeyNames(); //获取SOFTWARE下所有的子项
            foreach (string sName in sKeyNameColl)
            {
                if (sName == sKeyName)
                {
                    hklm.Close();
                    hkSoftWare.Close();
                    return true;
                }
            }
            hklm.Close();
            hkSoftWare.Close();
            return false;
        }


        //判断键值是否存在
        private bool IsRegistryValueNameExist(string sValueName)
        {
            string[] sValueNameColl;
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey hkTest = hklm.OpenSubKey(@"SOFTWARE	est");
            sValueNameColl = hkTest.GetValueNames(); //获取test下所有键值的名称
            foreach (string sName in sValueNameColl)
            {
                if (sName == sValueName)
                {
                    hklm.Close();
                    hkTest.Close();
                    return true;
                }
            }
            hklm.Close();
            hkTest.Close();
            return false;
        }

六、程序自启动程序

                //开启程序自启动
                string path = Application.ExecutablePath;
                RegistryKey rk = Registry.LocalMachine;
                RegistryKey rk2 = rk.CreateSubKey(@"SoftwareMicrosoftWindowsCurrentVersionRun");
                rk2.SetValue("JcShutdown", path);
                rk2.Close();
                rk.Close();



                //关闭程序自启动
                string path = Application.ExecutablePath;
                RegistryKey rk = Registry.LocalMachine;
                RegistryKey rk2 = rk.CreateSubKey(@"SoftwareMicrosoftWindowsCurrentVersionRun");
                rk2.DeleteValue("JcShutdown", false);
                rk2.Close();
                rk.Close();
原文地址:https://www.cnblogs.com/boby-/p/4724255.html