欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c# 操作注册表

程序员文章站 2022-06-12 17:08:06
...

要访问注册表,可以使用Microsoft.Win32命名空间中的两个类Registry 和RegistryKey。RegistryKey实例表示一个注册表项,这个类的方法可以浏览子键、创建新键、读取或修改键中的值。换言之,该类可以完成对注册表项进行的所有操作(除了设置键的安全级别之外)。RegistryKey类可以用于完成对注册表的所有操作。Registry是不能实例化的一个类。它的作用只是提供表示*键的RegistryKey实例(不同的巢),以便开始在注册表中浏览。Registry是通过静态属性来提供这些实例的,这些属性共有7个,分别是ClassesRoot、CurrentConfig、CurrentUser、DynData、LocalMachine、PerformanceData和 Users。用户可以很快猜出它们分别与哪个巢相对应。

例如,要获得一个表示HKLM键的RegistryKey实例,可以编写下面的代码:

RegistryKey hklm = Registry.LocalMachine;

获得RegistryKey对象引用的过程,视为打开一个键。

用户可能会认为,因为注册表的层次结构类似于文件系统,所以RegistryKey的方法类似于DirectoryInfo的方法,但实际上并非如此。访问注册表的方式通常不同于使用文件和文件夹的方式,RegistryKey执行的方法可以反映这种不同。

最明显的区别是如何在注册表的给定位置上打开一个注册表项。Registry类没有用户可以使用的公共构造函数,也没有任何可以直接通过键的名称来访问键的方法。但可以在相关的巢中从上至下浏览该键。如果要实例化一个RegistryKey对象,惟一的方式是从Registry的静态属性开始,向下浏览。例如,要读取HKLM/Software/Microsoft键中的一些数据,可以使用下面的代码获得它的一个引用:

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");

以这种方式访问注册表项是只读访问。如果要写入该键(包括写入其值,或创建和删除其子键),就需要使用OpenSubKey的另一个重写方法,该方法的第二个参数是bool类型,表示是否要对该键进行读写访问。例如,如果要修改Microsoft键(并假定用户是一个系统管理员,有修改该键的许可),就应编写如下代码:

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);

因为这个键包含Microsoft应用程序使用的信息,在大多数情况下,就不应修改这个特定键。

如果这个键已经存在,就应调用OpenSubKey()方法。如果这个键不存在,就返回一个空引用。如果要创建一个键,就应使用CreateSubKey()方法(该方法会通过返回的引用,自动提供该键的读写访问):

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");

CreateSubKey()工作的方式非常有趣:如果键不存在,它就创建这个键。但如果键已经存在,它就会返回一个表示该键的RegistryKey实例。这个方法采用这样的工作方式,其原因是用户总是可以使用这个键。注册表包含长期数据,例如Windows和各种应用程序的配置信息。因此用户并不需要经常显式地创建键。

更常见的是,应用程序需要确保某些数据在注册表中是存在的。换言之,如果这些数据不存在,就要创建相关的键,但如果它们存在,就不需要做任何事。CreateSubKey()就可以完成这项任务。与FileInfo.Open()的情况不同,CreateSubKey()不会删除任何数据。如果要删除注册表项,就需要显式调用RegistryKey.Delete()方法,因此注册表对于Windows是非常重要的。如果删除了一些重要的键,就会中断Windows的执行,此时就需要调试C#注册表调用了。

定位了要读取或修改的注册表项后,就可以使用SetValue() 或 GetValue()方法设置或获取该键中的值。这两个方法的参数都是一个字符串,其中字符串给出了值的名称,SetValue()还需要一个包含值的信息的对象引用。这个参数定义为对象引用,实际上可以是任何一个类的引用。SetValue()根据所提供的类的类型,确定把值设置为REG_SZ、REG_DWORD,还是 REG_BINARY。例如:

RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware");
hkMine.SetValue("MyStringValue", "Hello World");
hkMine.SetValue("MyIntValue", 20);

这段代码设置键包含两个值:MyStringValue的类型是REG_SZ,而MyIntValue的类型是REG_DWORD,这里只考虑这两种类型,在后面的示例中会使用它们。

RegistryKey.GetValue()的工作方式也是这样。它返回一个对象引用,如果该方法检测到值的类型为REG_SZ,就返回一个字符串引用,如果值的类型为REG_DWORD,就返回一个int型值。

string stringValue = (string)hkMine.GetValue("MyStringValue");
int intValue = (int)hkMine.GetValue("MyIntValue"); 

最后,完成了读取或修改数据后,应关闭该键:

```csharp
hkMine.Close();