分享

如何用.NET操作Windows注册表

 命運之輪 2006-10-16

如何用.NET操作Windows注册表

 

注册表是每个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处理注册表都比较容易。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多