C#成魔之路<15> 注册表技术

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

1、注册表基础

(1)概述
Windows注册表是包含安装、用户喜好以及已安装软件和设备的所有配置信息的核心存储库。商用软件基本都使用注册表信息来存储这些信息。COM组件必须把他的信息存储在注册表中,才能由客户程序调用。记录了用户账号、服务器硬件以及应用程序的设置信息等。同INI文件相比,注册表可以控制的数据更多,而且不仅仅限于处理字符串类型的数据。注册表也包含了一些系统配置的信息(因操作系统的不同而不同)。
打开注册表编辑器(regedit)。
注册表的所有信息都是分类保存的,‘主键’是各个大信息分类名称。注册表中所有信息都被分类存放在相应的主键中(基项)。
HKEY_ CLASSES_ROOT:用于保存在系统中注册的各类文件的控制名以及文件关联等信息。
HKEY_CURRENT _USER:用于保存登录到系统的当前用户的计算机的环境变量,桌面设置,应用程序设置,个人程序组,打印机和网络连接等信息。
HKEY_LOCAL _MACHINE:保存了计算机的硬件、软件以及操作系统的配置信息。
HKEY_USERS:用来保存计算机所有用户的配置信息。
HKEY_CURRENT _CONFIG:存放计算机当前硬件配置信息。

注册表:记录信息的存储器。

(2)Registry类和RegistryKey类
.NET提供了访问注册表的类,这两个类都在Microsoft.Win32命名空间中。

Registry类
Registry类是一个静态类,不能被实例化,作用只是实例化RegistryKey类,以便开始在注册表中浏览信息。Registry类是通过静态的只读字段来提供RegistryKey实例的,这些字段共有七个。
ClassesRoot:定义文档的类型或类,以及和这些类型关联的属性。该字段读取Windows注册表基项HKEY_ 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注册表基项HKEY_USERS。

注意:其API均为静态类型。

RegistryKey类
RegistryKey实例表示一个注册表项,这个类可以浏览子键、创建新键、读取或修改键中值。也就是说该类可以完成对注册表项的所有操作,除了设置键的安全级别之外。下面介绍RegistryKey类常用的属性和方法。
属性:
Name:检索项的名称。
SubKeyCount:检索当前项的子项数目。
ValueCount:检索项中值的计数。
方法:
Close:关闭。
CreateSubKey:创建给定名称的子键。如果已经存在,就打开它。
DeleteSubKey:删除指定的子键。
DeleteSubKeyTree:彻底删除子键及其所有的子键。
DeleteValue:从键中删除一个指定的值。
GetSubKeyNames:返回一个包含所有键值名称的字符串数组。
GetValue:返回指定值。
GetValueNames:返回一个包含所有键值名称的字符串数组。
OpenSubKey:返回表示给定子键的RegistryKey实例引用。
SetValue:设置指定的值。

2、在C#中操作注册表

(1)读取注册表中的信息

读取注册表中的信息主要是通过RegistryKey类中的OpenSubKey方法,GetSubKeyNames方法和GetValueNames方法实现。

OpenSubKey方法
用于检索指定的子项。

public RegistryKey OpenSubKey(string name)
//name表示要以只读模式打开的子项的名称或者路径。 返回所请求的子项。

示例程序:

  private void Form1_Load(object sender, EventArgs e)
        {
            RegistryKey rkMain = Registry.CurrentUser;
            RegistryKey rkChild = rkMain.OpenSubKey(@"Software");
        }

注意其命名空间为MicroSoft.Win32

GetSubKeyNames方法
用于检索包含所有子项名称的字符串数组。

public string[] GetSubKeyNames()
//返回值是包含当前子项名称的字符串数组。

示例程序:

  private void Form1_Load(object sender, EventArgs e)
        {
            RegistryKey rkMain = Registry.CurrentUser;
            RegistryKey sys = rkMain.OpenSubKey(@"Software");
            foreach (string str in sys.GetSubKeyNames())
            {
                richTextBox1.Text += str + '\n';
            }
        }

GetValueNames方法
GetValueNames方法用于检索包含与此项关联的所有“键名”的字符串数组。

public string[] GetValueNames()
//返回值是由当前项的所有键值对和键名组成的字符串。

示例程序:

  private void Form1_Load(object sender, EventArgs e)
        {
            this.listBox1.Items.Clear();
            RegistryKey rkMain = Registry.CurrentUser;
            RegistryKey rkChild = rkMain.OpenSubKey(@"Software");
            foreach (string item in rkChild.GetSubKeyNames())
            {
                this.listBox1.Items.Add("chile item: "+item);
                RegistryKey rkGrandChild = rkChild.OpenSubKey(item);
                foreach (string str in rkGrandChild.GetValueNames())
                {
                    this.listBox1.Items.Add(str+rkGrandChild.GetValue(str));
                }
                //通过循环嵌套将所有
                //键值对的键名和键值全部提取出来并且显示
            }
        }

(2)创建和修改注册表信息

通过RegistryKey类的CreateSubKey方法和SetValue方法可以创建注册表信息。

CreateSubKey方法
用于创建一个新子项或者打开一个现有子项从而进行写访问。语法:

public RegistryKey CreateSubKey(string subkey)
//subkey表示要创建或者打开子项的名称或者路径。该方法返回RegistKey对象,表示新建的子项或者空引用。subkey指定了零长度字符串,则返回当前的RegistryKey对象。

SetValue方法
用于设置注册表项中键值对的值。

public void SetValue(string name,Object value)
//name表示要存储的值的名称,参数value表示要存储的数据。

示例程序:

  private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey rkMain = Registry.CurrentUser;
                RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true);
                RegistryKey rkMR = rkSoftware.CreateSubKey("king");
                RegistryKey rkEast = rkMR.CreateSubKey("killer");

                rkEast.SetValue("king","killer");
                MessageBox.Show("创建成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

关于修改注册表信息。注册表信息非常重要,一般不要对其进行写操作。.NET出于这个原因,没有提供修改注册表键值的方法。只是提供了一个危害性相对较小的SetValue方法,通过这个方法可以用来修改键值。如果检测到指定的键名不存在就会创建一个新的键(键值对)。

示例程序:

  private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey rkMain = Registry.CurrentUser;
                RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true);
                RegistryKey rkMR = rkSoftware.OpenSubKey("king",true);
                RegistryKey rkEast = rkMR.OpenSubKey("killer",true);
                rkEast.SetValue("east","rise");


                MessageBox.Show("修改成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

(3)删除注册表中信息
主要通过RegistryKey类中的DeleteSubKey方法、DeleteSubKeyTree方法和DeleteValue方法来删除注册表中的信息。

DeleteSubKey方法
可以用于删除不包含任何子项的子项。

public void DeleteSubKey(string subkey,bool thowOnMissingSubKey)
//参数subkey表示要删除的子项的名称。把参数thowOnMissingSubKey的值设置为true。
//在程序调用的时候,如果删除的子项不存在,则产生一个错误信息
//如果设置为false,那么不会产生错误信息。

注意:如果删除项有子项的话,将会触发异常。必须将子项删除之后才能够删除该项。
示例程序:

 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey rkMain = Registry.CurrentUser;
                RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true);
                RegistryKey rkMR = rkSoftware.OpenSubKey("king",true);

                rkMR.DeleteSubKey("east",false);


                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

DeleteSubKeyTree方法
DeleteSubKeyTree方法用于彻底删除指定的子项目录,包括删除该子项以及该子项以下的全部子项。该方法破坏性非常强。所以使用的时候要特别谨慎。

public void DeleteSubKeyTree(string subkey)
//参数表示要彻底删除的子项。

示例程序:

  private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey rkMain = Registry.CurrentUser;
                RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true);
                RegistryKey rkMR = rkSoftware.OpenSubKey("king",true);

                rkMR.DeleteSubKeyTree("east",false);


                MessageBox.Show("删除成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

DeleteValue方法
DeleteValue方法主要用于删除指定的键值。

public void DeleteValue(string name)
//name 表示要删除的键值对的键名。

示例程序:

 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                RegistryKey rkMain = Registry.CurrentUser;
                RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true);
                RegistryKey rkMR = rkSoftware.OpenSubKey("king",true);
                RegistryKey rkEAST = rkSoftware.OpenSubKey("east", true);
                rkEAST.DeleteValue("east");


                MessageBox.Show("删除键值成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值