Windows 中的注册表文件( system.dat 和 user.dat )是 Windows 的核心数据库,因此,对 Windows 来说是非常重要的。通过修改注册表文件中的数据,可以达到优化 Windows 性能的效果。但修改注册表也可能导致整个 Windows 系统的崩溃!所以,在对注册表进行操作前或者是在安装一些软件前先对注册表进行备份。 下面介绍REG 文件的编写方法。 一、对主键的操作 1.新建一个主键 例如我们想在主键 HKEY_CURRENT_USER/Software 下新建一个名叫“我的软件”的主键。那么,你可以打开记事本,写入如下内容:
说明: (1) 第一行的 REGEDIT4 必须用大写。第二行必须为一个空行。在最后必须要有一个回车。 (2) Windows 95/98/ME/NT4.0等的REG文件开头第一行是“REGEDIT4”。而Windows 2000/XP则是“Windows Registry Editor Version 5.00”,用以区分所使用的操作系统。事实上,“REGEDIT4”适合目前任何Windows 操作系统(9X/2000/XP/2003)。 然后将这个文件保存成为 REG 格式。例如, reg.reg 双击运行此文件,会弹出两次确认信息,确定后计算机就会把我们写的注册表项目写入注册表文件中。你可以打开 Regedit.exe 来检查一下。
2.删除一个主键 例如我们想把刚才我们建的那个名叫“我的软件”的主键删除掉,那么我们可以在记事本中这么写:
注意到前面的减号“ - ”了吧,这就是删除的意思。将它保存成 reg 格式,运行。“我的软件”这个主键就被删掉了。 二、对键值项的操作 1.添加一个键值项 要新建一个键值项,必须要指明该键值所在的分支,该键值的名字、该键值的类型和该键值的值 ( 数据 ) 。例如要在分支 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer 下新建一个名为“ Nodrives ”,类型为“ Dword ” ,值为“ 00000004 ”的键值项。你可以这么写:
说明: (1) 键值类型 dword 必须用小写 ,其他类型如 hex 等也都必须用小写; (2) 在新建键值项时,如果该键值所在的主键分支不存在,在添加新键值的同时系统会自动创建该分支; (3) 在创建字符串类型的键值时,如果该字符串中包含路径分隔符,这个路径分隔符应该用双斜杠“ // ”表示。例如:
关于键值类型,除了 WindowsXP 外,其他的 Windows 版本中都只有三种: Dword 值、二进制值和字符串值。在 REG 文件中, Dword 值用 dword 表示,二进制值用 hex 表示,字符串值直接用引号把内容括起来就行。至于在 WindowsXP 中,除了这三种外又增加了两种:多字符串值和可扩充字符串值。 在 REG 文件中,默认键值是用 @ 表示的,并且没有引号。 2、删除一个键值项目 例如我们要删除刚才创建的“ Nodrives ”键值,我们可以这么写:
注意到等号后面的减号了吧,这就是删除的意思。 3、修改键值项的值 例如我们想将前面创建的“ Nodrives ”键值项的值由原来的 00000004 改为 0000000c ,那么我们可以这么写:
这和创建一个新键值的方法是类似的,计算机会自动用 0000000c 将 00000004 替换掉。 以上都是一次执行一个操作,如果你想一次执行“一批”操作呢?很简单,只要把你要操作的项目一条一条的写入 REG 文件里就行了。如果是对同一个主键下的键值进行操作,你只要写一次键值所在的分支就可以,因为他们的分支都一样。例如:
在c#操作注册表: Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键
注册表是视窗系统的一个核心的数据库,在这个数据库中存放中与系统相关的各种参数,这些参数直接控制中系统的启动、硬件的驱动程序安装信息以及在视窗系统上运行的各种应用程序的注册信息等。这就意味着,如果注册表因为某些原因受到了破坏,轻者是视窗系统启动过程出现异常,重者就有可能导致整个系统的完全瘫痪。所以正确的认识注册表,及时的备份注册表,对于视窗用户就显得相当重要。 Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 Registry.User 对应于 HKEY_USER主键 Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键 Registry.DynDa 对应于HKEY_DYN_DATA主键 Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键 (2).RegistryKey类:此类中主要封装了对视窗系统注册表的基本操作。在程序设计中,首先通过Registry类找到注册表中的基本主键,然后通过RegistryKey类,来找其下面的子键和处理具体的操作的。 OpenSubKey ( string name )方法主要是打开指定的子键。 GetSubKeyNames ( )方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。 GetValueNames ( )方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。 GetValue ( string name )方法是指定键的键值。 程序中具体的使用语句如下: RegistryKey hklm = Registry.LocalMachine ; //打开"SYSTEM"子键 RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ; //打开"001"子键 RegistryKey no1 = software.OpenSubKey ( "001" ) ; //打开"002"子键 RegistryKey no2 = no1.OpenSubKey ( "002" ) ; 其中listBox1是程序中定义了的列表名称。 foreach ( string site in no2.GetSubKeyNames ( ) ) //开始遍历由子键名称组成的字符串数组 { listBox1.Items.Add ( site ) ; //在列表中加入子键名称 RegistryKey sitekey = no2.OpenSubKey ( site ) ; //打开此子键 foreach ( string sValName in sitekey.GetValueNames ( ) ) //开始遍历由指定子键拥有的键值名称组成的字符串数组 { listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ; //在列表中加入键名称和对应的键值 } } 通过以上的论述,我们可以得到程序的源程序代码,具体如下: using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; using Microsoft.Win32 ; public class Form1 : Form { private System.ComponentModel.Container components ; private ListBox listBox1 ; private Button button1 ; public Form1 ( ) { InitializeComponent ( ) ; } //清除在程序中使用过的资源 public override void Dispose ( ) { base.Dispose ( ) ; components.Dispose ( ) ; } //初始化程序中使用到的组件 private void InitializeComponent ( ) { this.components = new System.ComponentModel.Container ( ) ; this.button1 = new Button ( ) ; this.listBox1 = new ListBox ( ) ; button1.Location = new System.Drawing.Point ( 16 , 320 ) ; button1.Size = new System.Drawing.Size ( 75 , 23 ) ; button1.TabIndex = 0 ; button1.Text = "读取注册表" ; button1.Click += new System.EventHandler( this.button1_Click ) ; listBox1.Location = new System.Drawing.Point ( 16 , 32 ) ; listBox1.Size = new System.Drawing.Size ( 496 , 264 ) ; listBox1.TabIndex = 1 ; this.Text = "读取主测表信息" ; this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ; this.ClientSize = new System.Drawing.Size ( 528 , 357 ) ; this.Controls.Add( this.listBox1 ) ; this.Controls.Add ( this.button1 ) ; } // protected void button1_Click ( object sender , System.EventArgs e ) { listBox1.Items.Clear ( ) ; RegistryKey hklm = Registry.LocalMachine ; RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ; //打开"SYSTEM"子键 RegistryKey no1 = software.OpenSubKey ( "001" ) ; //打开"001"子键 RegistryKey no2 = no1.OpenSubKey ( "002" ) ; //打开"002"子键 foreach ( string site in no2.GetSubKeyNames ( ) ) //开始遍历由子键名称组成的字符串数组 { listBox1.Items.Add ( site ) ; //在列表中加入子键名称 RegistryKey sitekey = no2.OpenSubKey ( site ) ; //打开此子键 foreach ( string sValName in sitekey.GetValueNames ( ) ) //开始遍历由指定子键拥有的键值名称组成的字符串数组 { listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ; //在列表中加入键名称和对应的键值 } } } // public static void Main ( ) { Application.Run ( new Form1 ( ) ) ; } } 用C#读取注册表中的注册信息是通过名称空间Micorsoft.Win32中的二个类来实现的。在这二个类中还定义了对注册表信息的删除、修改和重命名的一些方法。这些方法比起本文介绍的读取方法、打开方法来说,更具有破坏性,但也更实用。由于注册表在视窗系统中的重要作用,所以在每一次对注册表进行操作之前,一定要备份,在操作的时候也要非常小心,因为一次的误操作都可能导致系统崩溃。 |