您的位置:首页 > 编程语言 > C#

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

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

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));
}

4000
//通过循环嵌套将所有
//键值对的键名和键值全部提取出来并且显示
}
}


(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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  注册表 C#