天天看点

C# 2.0 操作注册表

众所周知:Windows 操作系统包含有一个注册表,其中有很多关于计算机软、硬件运行的配置。做为软件人员有时需要编辑注册表,这里就先介绍一点注册表的常识。

打开注册表,可以看到根目录的树状结构,其中第二级目录包含了五个预定义主键,分别是:

HKEY_CLASSES_ROOT,

HKEY_CURRENT_USER,

HKEY_LOCAL_MACHINE,

HKEY_USERS,

HKEY_CURRENT_CONFIG。  

一、下面分别解释这5个类的作用:

1、HKEY_CLASSES_ROOT 主键包含了文件的扩展名和应用程序的关联信息以及Window Shell和OLE用于储存注册表的信息。该主键下的子键决定了在WINDOWS中

如何显示该类文件以及他们的图标,该主键是从HKEY_LCCAL_MACHINE/SOFTWARE/Classes映射过来的。  

2、HKEY_CURRENT_USER 主键包含了如用户窗口信息,桌面设置等当前用户的信息。

3、HKEY_LOCAL_MACHINE 主键包含了计算机软件和硬件的安装和配置信息,该信息可供所有用户使用  

4、HKEY_USERS 主键记录了当前用户的设置信息,每次用户登入系统时,就会在该主键下生成一个与用户登入名一样的子键,该子键保存了当前用户的桌面设

置、背景位图、快捷键,字体等信息。一般应用程序不直接访问改主键,而是通过主键HKEY_CURRENT_USER进行访问。  

5、HKEY_CURRENT_CONFIG 主键保存了计算机当前硬件的配置信息,这些配置可以根据当前所连接的网络类型或硬件驱动、软件安装的改变而改变。  

二、操作注册表的方法:

       C#也支持对注册表的编辑,.NET框架在 Microsoft.Win32 名字空间中提供了两个类来操作注册表:Registry和RegistryKey。

这两个类都是密封类不允许被继承。下面我们分别来介绍这两个类。  

    Registry类提供了7个公共的静态域,分别代表7个基本主键(其中两个在XP系统中没有)分别是:

1、Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键

2、Registry.CurrentUser 对应于HKEY_CURRENT_USER主键

3、Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键

4、Registry.User 对应于 HKEY_USER主键

5、Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键

6、Registry.DynDa 对应于HKEY_DYN_DATA主键

7、Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键

RegistryKey类封装了对注册表的基本操作,包括读取、写入、删除。其中详细请看下面。

读取的主要函数有:

1、OpenSubKey(string name)方法主要是打开指定的子键。

2、GetSubKeyNames()方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。

3、GetValueNames()方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。

4、GetValue(string name)方法是指定键的键值。

写入的主要函数有:

1、CreateSubKey(string name)方法是增加一个子键

2、SetValue(string name,string value)方法是设置一个键的键值

删除的主要函数有:

1、DeleteSubKey()方法:删除一个指定的子键。

2、DeleteSubKeyTree()方法:彻底删除指定的子键目录,即:删除该子键以及该子键以下的全部子键。

三、对注册表的操作:

需要注意的是操作注册表必须符合系统设定的权限,否则将会抛出错误。  

下面我们就来操作注册表

1、创建子键的方法原型为:  

       public RegistryKey CreateSubKey(string sunbkey);  

       参数sunbkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键,否则返回 null。  

2、打开子键的方法原型为:  

       public RegistryKey OpenSubKey(string name);  

       public RegistryKey OpenSubKey(string name, bool writable);  

       参数name表示要打开的子键名或其路径名,参数writable表示被打开的子键是否允许被修改,第一个方法打开的子键是只读的。

3、Microsoft.Win32类还为我们提供了另一个方法,用于打开远程计算机上的注册表,方法原型为:  

       public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey, string machineName);

4、删除子键的方法原型为:  

       public void DeleteSubKey(string subkey);  

       该方法用于删除指定的主键。如果要删除的子键还包含主键则删除失败,并抛出一个异常,如果要彻底删除该子键极其目录下的子键可以用方法

DeleteSubKeyTree,该方法原型如下:  

       public void DeleteSubKeyTree(string subkey);  

5、读取键值的方法原型如下:  

       public object GetValue(string name);  

       public object GetValue(string name, object defaultValue);  

       参数name表示键的名称,返回类型是一个object类型,如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数

defaultValue,指定了参数则在读取失败的情况下返回该参数指定的值。  

6、设置键值的方法原型如下:  

       public object SetValue(string name,object value);

四、举例说明:

假如我们现在需要在注册表中"About"子键写入一些信息:OSVer、Windows XP。首先需要创建子键"About",该子键在"HKEY_LOCAL_MACHINE"主键下面的"SOFTWARE"子键里。

我们就需要像下面这样操作了。

插入注册表值:

       RegistryKey Rgk = Registry.LocalMachine;  // 先确定要写入的主键

       RegistryKey OpenKey = Rgk.OpenSubKey("SOFTWARE", true);      //打开子键,并且允许写入(参数writable为true)。

       RegistryKey CreatKey = OpenKey.CreateSubKey("About"); //在"SOFTWARE"下面创建子键"About"。

       CreatKey.SetValue("OSVer", "Windows XP");

删除注册表值:

       RegistryKey Rgk = Registry.LocalMachine;  // 先确定主键

       RegistryKey DelKey = Rgk.OpenSubKey("SOFTWARE", true);  //打开主键下的子键,并且允许更改或删除(参数writable为true)。

       DelKey.DeleteSubKey("About");    //删除子键"About"。如果其下还有子键,将抛出异常,必须使用下面的方法。

       // DelKey.DeleteSubKeyTree("About"); //删除子键"About"及其下面的所有内容。

// DeleteSubKey("About") 与DeleteSubKeyTree("About")不同,读者可以自己测试,体会一下。

读取注册表值:

       RegistryKey Rgk = Registry.LocalMachine;  // 先确定主键

       RegistryKey ReadKey = Rgk.OpenSubKey("SOFTWARE");       //打开主键下的子键。

       RegistryKey RdKey = ReadKey.OpenSubKey("About", false);;    //打开子键,并且不允许更改或删除(参数writable为true)。

       Object objRdVal = RdKey.GetValue("OSVer");      //读取"OSVer"该键值,注意返回值类型为Object,而不是其他类型。

完整的C#类代码(Visual C# 2005):

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.Win32;

namespace Win

{

    class RegistCRD

    {

        public RegistCRD()

        {

            //

            //TODO: 在此处添加构造函数逻辑

            //

        }

        /// <summary>

        /// 将值写入注册表

        /// </summary>

        public void writeRegistKey()

        {

            RegistryKey Rgk = Registry.LocalMachine;  // 先确定要写入的主键

            RegistryKey OpenKey = Rgk.OpenSubKey("SOFTWARE", true);      //打开子键,并且允许写入(参数writable为true)。

            RegistryKey CreatKey = OpenKey.CreateSubKey("About"); //在"SOFTWARE"下面创建子键"About"。

            CreatKey.SetValue("OSVer", "Windows XP");

        }

        /// <summary>

        /// 将指定的子键从注册表中删除

        /// </summary>

        public void deletRegistKey()

        {

            RegistryKey Rgk = Registry.LocalMachine;  // 先确定主键

            RegistryKey DelKey = Rgk.OpenSubKey("SOFTWARE", true);  //打开主键下的子键,并且允许更改或删除(参数writable为true)。

            //DelKey.DeleteSubKey("About");  //删除子键"About"。如果其下有内容,将抛出异常。

            DelKey.DeleteSubKeyTree("About");    //删除子键"About"及其下面的所有内容。

        }

        /// <summary>

        /// 读取指定的子键项目值

        /// </summary>

        public string readRegistKey()

        {

            RegistryKey Rgk = Registry.LocalMachine;  // 先确定主键

            RegistryKey ReadKey = Rgk.OpenSubKey("SOFTWARE");       //打开主键下的子键。

            RegistryKey RdKey = ReadKey.OpenSubKey("About", false); ;   //打开子键,并且不允许更改或删除(参数writable为true)。

            Object objRdVal = RdKey.GetValue("OSVer");      //读取"OSVer"该键值,注意返回值类型为Object,而不是其他类型。

            return objRdVal.ToString();

        }

    }

}

继续阅读