众所周知: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();
}
}
}