注册表是每个Windows系统的重要组成部分。它包含与操作系统配置,硬件和所安装软件有关的大量信息。在.NET出现前,通过编程访问注册表要应用Windows API(应用程序接口)。.NET Framework通过Microsoft.Win32命名空间简化了这一过程。本文详细说明如何通过.NET操作注册表。
注册表概述
Windows注册表呈树状或层次结构。Windows提供注册表编辑器(regedt32.exe/regedit/exe)对其进行编辑。注册表由包含所有数据的键构成。这些键不能被删除或重命名。下表概括说明了这些键:
- HKEY_CURRENT_USER:保存当前登录用户的配置信息。用户的文件夹、屏幕颜色和控制面板设置都存储在这个键中(也可称作用户基本资料)。它是HKEY_USERS的一个子键。
- HKEY_USERS:这个键中包含计算机上所有用户的基本资料。
- HKEY_LOCAL_MACHINE:这个键包含计算机的配置信息。
- HKEY_CLASSES_ROOT:这个键包含文件关联信息。也就是说,它告诉Windows打开特定类型的文件应使用何种程序。它是HKEY_LOCAL_MACHINE\Software的一个子键。
- HKEY_CURRENT_CONFIG:这个键包含计算机硬件信息。
- HKEY_PERFORMANCE_DATA:在安装软件时,每个软件组件为它的对象和计数器建立键,并在执行时写入计数器数据。这种性能数据存储在这个键中。
这些键能够以各种方式存储数据。在注册表中,共有六个数据类型可用来存储数据。这些数据类型如下表所示:
- REG_BINARY:以一串十六进制数对存储的二进制数据,每个数对的值在0-255之间。REG_BINARY的长度不固定。
- REG_DWORD:它为双字数据类型,由四个字节(32位)的数字组成,其值在0-4GB之间。设备驱动器和服务参数通常为此数据类型。
- REG_EXPAND_SZ:这个可扩充的字符串数据类型实际上是一个变量。在使用时,当字符串被系统调用时,它的值被真正的值代替。
- REG_MULTI_SZ:多个字符串值,不同的值用空格、逗号和其它符号隔开。
- REG_SZ:固定长度的文字字符串值。
- REG_FULL_RESOURCE_DESCRIPTOR:它用于硬件注册表键中。
了解了注册表的基础知识,你就能够利用适当的.NET类来处理注册表的内容。
处理注册表
Microsoft.Win32命名空间为处理注册表提供必要的类。命名空间中的两个主要的类为Registry和RegistryKey。Registry联合RegistryKey一起访问个别的注册表键。它映射到前面列出的主要注册表键。
- Registry.CurrentUser
- Registry.Users
- Registry.LocalMachine
- Registry.ClassesRoot
- Registry.CurrentConfig
- Registry.PerformanceData
RegistryKey类利用前面列表中的一个Registry类项目来访问单个的注册表键。下面的C# Windows应用程序代码显示ClassesRoot注册表键中一个特殊条目的信息。
RegistryKeyrootKey = Registry.ClassesRoot;
rootKey = rootKey.OpenSubKey(".doc", true);
MessageBox.Show(rootKey.GetValue("").ToString());
MessageBox.Show(rootKey.GetValue("Content Type").ToString());
foreach(string sub in rootKey.GetSubKeyNames()) {
MessageBox.Show(sub);
RegistryKeytmp = rootKey.OpenSubKey(sub);
MessageBox.Show(tmp.Name);
}
foreach(string test in rootKey.GetValueNames()) {
MessageBox.Show(rootKey.GetValue(test).ToString());
}
代码参考正确的命名空间以利用注册表类。
using Microsoft.Win32;
代码访问ClassesRoot键(.doc)中的特定子键。该键对系统如何处理带特定文件扩展名(.doc)的文件进行定义。前两个消息对话框语句显示键本身的信息。提交到RegistryKey类GetValue方法的空值显示默认键值。第二个消息对话框显示与键有关的内容类型(MIME类型)。
第一个foreach块显示注册表键中所有子键的名称。第二个foreach块显示与前两个消息对话框语句一样的信息,但使用GetValueNames方法获得同样的结果(所以你不必知道项目的名称)。
对应的VB.NET代码如下:
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
Dim regSubKey As RegistryKey
Dim subk As String, test As String
Dim tmp As RegistryKey
rootKey = rootKey.OpenSubKey(".doc", True)
MessageBox.Show(rootKey.GetValue("").ToString())
MessageBox.Show(rootKey.GetValue("Content Type").ToString())
For Each subk In rootKey.GetSubKeyNames()
MessageBox.Show(subk)tmp = rootKey.OpenSubKey(subk)
MessageBox.Show(tmp.Name)
Next
or Each test In rootKey.GetValueNames()
MessageBox.Show(rootKey.GetValue(test).ToString())
Next
注:子键名不区分大小写。
增加注册表值
查阅注册表值不错,但有时候你需要增加注册表值。通常,应用程序把注册表当作存储应用程序相关数据的中央仓库。这种方法可以接受,但为避免系统或应用程序出现问题,我们不建议修改Windows系统或其它应用程序的值。
RegistryKey类中包含CreateSubKey方法,可用它来增加特定注册表键元素的子键。另外,SetValue方法允许你增加键的项目与值。下面的实例给HKEY_CLASSES_ROOT键增加了一个子键。给键增加空白值设定了它的默认键值。
RegistryKeyrootKey = Registry.ClassesRoot;
RegistryKeyregSubKey;
rootKey = rootKey.OpenSubKey(".doc", true);
regSubKey = rootKey.CreateSubKey ("Newsletter");
regSubKey.SetValue("Site", "www.techrepublic.com");
regSubKey.SetValue("", "Test Link");
对应的VB.NET代码如下:
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
Dim regSubKey As RegistryKey
rootKey = rootKey.OpenSubKey(".doc", True)
regSubKey = rootKey.CreateSubKey("Newsletter")
regSubKey.SetValue("Site", "www.techrepublic.com")
regSubKey.SetValue("", "Test Link")
用DeleteSubKey方法可以方便地删除键,所以我们可以用下面的VB.NET代码轻松删除新建的子键。
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
rootKey = rootKey.OpenSubKey(".doc", True)
rootKey.DeleteSubKey("Newsletter")
另外,DeleteSubKeyTree方法允许你删除一个子键和递归子级子键。
警告
注册表是Windows中最重要的组件。因此,在处理其内容时,你应该极度小心;因为无意改变系统或应用程序键可能会造成系统或应用程序故障。但是,注册表可作为一个存储点,用来存储你所开发的应用程序的专用数据。幸运的是,不管你应用哪种语言,用.NET Framework处理注册表都比较容易。
|