C#学习之旅(十)

C#学习之旅(十)

1、注册表基础

        注册表是一个庞大的数据库系统,它记录了用户安装在计算机上的软件、硬件信息和每一个程序的相互关系。注册表中存放着很多参数,直接控制着整个系统的启动,硬件驱动程序的装载以及应用程序的运行。

1.1、Windows注册表概述

        Windows注册表包含Windows安装、用户喜好以及已安装软件和设备的所有配置信息的核心存储库。现在商用软件基本上都是用注册表来存储这些信息,COM组件必须把它的信息存储在注册表中,才能由客户程序调用。注册表的层次结果非常类似于文件系统,它记录了用户账号、服务器硬件以及应用程序的设置信息等。同INI文件相比,注册表可以控制的数据更多,而且不仅仅限于处理字符串类型的数据。注册表也包含了一些系统配置的信息,这些信息根据操作系统的不同而不同。选择“开始”->“运行”命令。在“打开”文本框中输入regedit后,单击“确定”按钮即可打开“注册表编辑器”窗口。

在这里插入图片描述
        注册表就好像是记录信息的存储器,这些信息既可以在存储器中进行记录,也可以在存储器中进行修改和读取。同样,用户也可以在存储器中以键/值对的形式进行记录的操作

1.2、Registry和RegistryKey类

        .NET Framework提供了访问注册表的类,比较常用的是Registry和RegistryKey类,这两个类都在Microsoft.Win32命名空间中。下面详细介绍这两个类。

        说明:
    由于Windows10系统本身的安全性问题,使用C#操作注册表时,可能会提示无法操作响应的注册表项,这时只需要为提示的注册表项添加everyone用户的读写权限即可。

        1、Registry类
    Registry类不能被实例化,它的作用只是实例化RegistryKey类,以便开始在注册表中浏览。Registry类是通过静态属性来提供这些实例的,这些属性共有7个。

        (Registry类的常用属性及说明)

        说明:
    Registry类主要用于存储有关用户首选项的信息,存储本地计算机的配置信息、存储有关类型和类以及其属性的信息、存储有关默认用户配置的信息、存储软件组件的性能信息、存储非用户特定的硬件信息、存储动态数据。

        要获取一个表示HKLM键的RegistryKey实例,代码如下。
    RegistyrKey hklm = Registry.LocalMachine

        2、RegistryKey类
    RegistryKey实例表示一个注册表项,这个类的方法可以浏览子键、创建新键或修改键中的值。也就是说,该类可以完成对注册表项的所有操作。除了设置键的安全级别之外,RegistryKey类可以用于完成对注册表的所有操作。

        (RegistryKey类的常用属性及说明)

        (RegistryKey类的常用方法及说明)

2、在C#中操作注册表

2.1、读取注册表中的信息

        1、OpenSubKey()方法
    OpenSubKey()方法用于检索指定的子项。
    
    语法如下:
    public RegistryKey OpenSubKey(string name)
    name:要以只读方式打开子项的名称或路径
    返回值:请求的子项。如果操作失败,则为空引用

        说明:
    如果要打开的项不存在,OpenSubKey()方法将返回null引用,而不是引发异常。

        2、GetSubKeyNames()方法
    GetSubKeyNames()方法用于检索包含所有子项名称的字符串数组。
    
    语法如下:
    public string[] GetSubKeyNames()
    返回值:包含当前的子项名称的字符串数组。

        说明:
    如果当前项已被删除,或是用户没有读取该项的权限,将触发异常。
    实例如下:

using Microsoft.Win32;
namespace Test01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //创建RegistryKey实例
            RegistryKey regkey = Registry.LocalMachine;

            //使用OpenSubKey()方法打开HKEY_LOCAL_MACHINE\SOFTWARF键
            RegistryKey sys = regkey.OpenSubKey(@"SOFTWARE");

            //调用foreach语句读取HKEY_LOCAL_MACHINE\SOFTWARE键下的所有项目
            foreach (string str in sys.GetSubKeyNames())
            {
                richTextBox1.Text += str + "\n";
            }
        }
    }
}

在这里插入图片描述
        3、GetValueNames()方法
    GetValueNames()方法用于检索包含与此项目关联的所有值名称的字符串数组。
    
    语法如下:
    public string[] GetValueNames()
    返回值:返回当前项的值名称的字符串数组。

        说明:
    如果没有找到此项的值名称,则返回一个空数组;如果在注册表项设置了一个具有默认值的名称为空字符串的项,则GetValueNames()方法返回的数组中包含该空字符串。
    实例如下:

using Microsoft.Win32;
namespace Test02
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //消除listBox1控件中的值
            this.listBox1.Items.Clear();

            //创建RegistryKey实例
            RegistryKey regkey = Registry.LocalMachine;

            //使用OpenSubKey()方法打开HKEY_LOCAL_MACHINE\SOFTWARF键
            RegistryKey sys = regkey.OpenSubKey(@"SOFTWARE");

            //使用两个foreach语句检索HKEY_LOCAL_MACHINE\SOFTWARE键下的所有子项目
            foreach (string str in sys.GetSubKeyNames())
            {
                this.listBox1.Items.Add("子项名:" + str);
                RegistryKey sikey = sys.OpenSubKey(str);         //打开子键
                foreach (string sVName in sikey.GetValueNames())
                {
                    this.listBox1.Items.Add(sVName + sikey.GetValue(sVName));
                }
            }
        }
    }
}

在这里插入图片描述

2.2、创建和修改注册表信息

        1、创建注册表信息
    通过RegistryKey类的CreateSubKey()方法和SetVaule()方法可以创建注册表信息,下面介绍这两种方法。
    
    (1)、CreateSubKey()方法主要用于创建一个新子项或打开一个现有子项以进行写访问。
    
    语法如下:
    public RegistryKey CreateSubKey(string subkey)
    subkey:要创建或打开的子项的名称或路径
    返回值:RegistryKey对象,表示新建的子项或空引用。如果为subkey指定了零长度字符串,则返回当前的RegistryKey对象。
    
    (2)、SetValue()方法主要用于设置注册表中的名称/值对的值。
    
    语法如下:
    name:要存储的值的名称
    value:要存储的数据

        说明:
    SetValue()方法用于从非托管代码中访问托管类,不应从托管代码调用。
    实例如下:

using Microsoft.Win32;
namespace Test03
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //创建RegistryKey实例
                RegistryKey hklm = Registry.LocalMachine;

                //使用OpenSubKey()方法打开HKEY_LOCAL_MACHINE\HARDWARE键
                RegistryKey software = hklm.OpenSubKey("HARDWARE", true);

                //使用CreateSubKey()方法创建名为MR的子键
                RegistryKey main1 = software.CreateSubKey("MR");

                //在子键测试下建立一个名为Value的键值,数据值为1234
                RegistryKey ddd = main1.CreateSubKey("测试");
                ddd.SetValue("value", "1234");
                MessageBox.Show("创建成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

在这里插入图片描述
        2、修改注册表信息
    由于注册表中的信息十分重要,所以一般不对其进行写的操作。也可能是这个原因,在.Net Framework中并没有提供修改注册表键的方法。而只是提供了一个危害性相对较小的SetValue()方法,通过这个方法,可以修改键值。在使用SetValue()方法时,如果它检测到指定的键值不存在,就会创建一个新的键值。
    value:实例如下:

using Microsoft.Win32;
namespace Test04
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //创建RegistryKey实例
                RegistryKey hklm = Registry.LocalMachine;
                //使用OpenSubKey方法打开HKEY_LOCAL_MACHINE\HARDWARE键
                RegistryKey software = hklm.OpenSubKey("HARDWARE", true);
                //使用OpenSubKey方法打开MR键
                RegistryKey dddw = software.OpenSubKey("MR", true);
                //使用OpenSubKey方法打开测试子键
                RegistryKey regkey = dddw.OpenSubKey("测试", true);
                //然后使用SetValue()方法修改指定的键值
                regkey.SetValue("value", "abcd");
                MessageBox.Show("修改成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

在这里插入图片描述

2.3、删除注册表中的信息

        1、DeleteSubKey()方法
    DeleteSubKe()方法用于删除不包含任何子键的子键。
    
    语法如下:
    public void DeleteSubKey(string subkey, bool throwOnMissingSubKey)
    subkey:要删除的子项的名称
    throwOnMissingSubKey:如果值为true,程序调用时,删除的子键不存在,则产生一个错误信息;如果值为false,在程序调用时,删除的子键不存在,也不产生错误信息,程序依然正确运行。

        说明:
    如果删除的项有子级子项,将触发异常,必须将子项删除后,才能删除该项。
    实例如下:

using Microsoft.Win32;
namespace Test05
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey hklm = Registry.LocalMachine;
                //打开"SOFTWARE"子键
                RegistryKey software = hklm.OpenSubKey("HARDWARE", true);
                //打开MR子键
                RegistryKey no1 = software.OpenSubKey("MR", true);
                //删除名称为测试的子键
                no1.DeleteSubKey("测试", false);
                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

在这里插入图片描述
        2、DeleteSubKeyTree()方法
    DeleteSubKeyTree()方法用于删除指定的子键目录,包括删除子键以及该子键以下的全部子键。由于此方法的破坏性非常强,所以在使用时要特别谨慎。
    
    语法如下:
    public void DeleteSubKeyTree(string subkey)
    subkey:要彻底删除的子键名称。

        说明:
    当删除的项为null时,则触发异常
    实例如下:

using Microsoft.Win32;
namespace Test06
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey hklm = Registry.LocalMachine;
              
                //打开"SOFTWARE"子键
                RegistryKey software = hklm.OpenSubKey("HARDWARE", true);

                //打开MR子键
                RegistryKey no1 = software.OpenSubKey("MR", true);

                //删除名称为测试的子键
                no1.DeleteSubKeyTree("测试");
                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

        3、DeleteValue(string name)方法
    DeleteValue()方法主要用于删除指定的键值。
    
    语法如下:
    public void DeleteValue(string name)
    subkey:要删除的值的名称

        说明:
    如果在找不到指定值的情况下使用该值,又不想引发异常,可以使用DeleteValue(string name, bool throwOnMissingValue)重载方法。如果throwOnMissingValue参数为true时,将不引发异常。
    实例如下:

using Microsoft.Win32;
namespace Test07
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey hklm = Registry.LocalMachine;
                //打开"HARDWARE"子键
                RegistryKey software = hklm.OpenSubKey("HARDWARE", true);
                //打开MR子键
                RegistryKey no1 = software.OpenSubKey("MR", true);
                //打开测试子键
                RegistryKey no2 = no1.OpenSubKey("测试", true);

                //删除名称为"value"的键值
                no2.DeleteValue("value");
                MessageBox.Show("删除键值成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Registry类的常用属性及说明

属性说明
ClassesRoot定义文档的类型(或类)以及与那些类型关联的属性。该字段读取Windows注册表基项 HKET_CLASSES_ROOT
CurrentConfig包含有关非用户特定的硬件的配置信息。该字段读取Windows注册表基项 HKEY_CURRENT_CONFIG
CurrentUser包含有关当前用户首选项的信息。该字段读取Windows注册表基项 HKEY_CURRENT_USER
DynData包含动态注册表数据。该字段读取Windows注册表基项 HKEY_DYN_DATA
LocalMachine包含本地计算机的配置数据。该字段读取Windows注册表基项 HKEY_LOCAL_MACHINE
PerformanceData包含软件组件的性能信息。该字段读取Windows注册表基项 HKEY_PERFORMANCE_DATA
Users包含有关默认用户配置的信息。该字段读取Windows注册表基项 HEKY_USERS







RegistryKey类的常用属性及说明

属性说明
Name检索项的名称
SubKeyCount检索当前项的子项数目
ValueCount检索项中值的计数







RegistryKey类的常用方法及说明

方法说明
Close关闭键
CreateSubKey创建给定名称的子键(如果该子键已经存在,就打开它)
DeleteSubKey删除指定的子键
DeleteSubKeyTree删除子键及其所有的子键
DeleteVal从键中删除一个指定的值
GetSubKeyNames返回包含子键名称的字符串数组
GetValue返回指定的值
GetValueNames返回一个包含所有键值名称的字符串数组
OpenSubKey返回表示给定子键的RegistryKey实例引用
SetVal设置指定的值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扑腾的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值