C#中对注册表的操作

Windows 操作系统的注册表包含了很多有关计算机运行的配置方式,打开注册表我们可以看到注册表是按类似于目录的树结构组织的,其中第二级目录包含了五个预定义主键分别是:HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS,HKEY_CURRENT_CONFIG。下面我们来分别解释这5个类的作用    
   HKEY_CLASSES_ROOT该主键包含了文件的扩展名和应用程序的关联信息以及Window Shell和OLE用于储存注册表的信息。该主键下的子键决定了在WINDOWS中如何显示该类文件以及他们的图标,该主键是从HKEY_LCCAL_MACHINE\SOFTWARE\Classes映射过来的。
   HKEY_CURRENT_USER该主键包含了如用户窗口信息,桌面设置等当前用户的信息。
   HKEY_LOCAL_MACHINE主键包含了计算机软件和硬件的安装和配置信息,该信息可供所有用户使用
   HKEY_USERS该主键记录了当前用户的设置信息,每次用户登入系统时,就会在该主键下生成一个与用户登入名一样的子键,该子键保存了当前用户的桌面设置、背景位图、快捷键,字体等信息。一般应用程序不直接访问改主键,而是通过主键HKEY_CURRENT_USER进行访问。
    HKEY_CURRENT_CONFIG该主键保存了计算机当前硬件的配置信息,这些配置可以根据当前所连接的网络类型或硬件驱动软件安装的改变而改变。

   1. C#也支持对注册表的编辑,.NET框架在Microsoft.Win32名字空间中提供了两个类来操作注册表:Registry和RegistryKey。这两个类都是密封类不允许被继承。下面我们分别来介绍这两个类。
   Registry类提供了7个公共的静态域,分别代表7个基本主键(其中两个在XP系统中没有,在这就不介绍了)分别是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig。它们分别对应哪几个键我想各位一看就会知道吧。
    RegistryKey类中提供了对注册表操作的方法。要注意的是操作注册表必须符合系统权限,否则将会抛出错误。
下面是操作注册表常用的几个方法
--1.创建子键的方法原型为:
public RegistryKey CreateSubKey(string sunbkey);
参数sunbkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键,否则返回null。

--2.打开子键的方法原型为:
public RegistryKey OpenSubKey(string name);
public RegistryKey OpenSubKey(string name,bool writable);
   参数name表示要打开的子键名或其路径名,参数writable表示被打开的子键是否允许被修改,第一个方法打开的子键是只读的。Microsoft.Win32类还为我们提供了另一个方法,用于打开远程计算机上的注册表,方法原型为:
public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey,string machineName);

--3.删除子键的方法原型为:
public void DeleteKey(string subkey);
   该方法用于删除指定的主键。如果要删除的子键还包含主键则删除失败,并返回一个异常,如果要彻底删除该子键极其目录下的子键可以用方法DeleteSubKeyTree,该方法原型如下:
public void DeleteKeyTree(string subkey);

--4.读取键值的方法原型如下:
public object GetValue(string name);
public object GetValue(string name,object defaultValue);
   参数name表示键的名称,返回类型是一个object类型,如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数defaultValue,指定了参数则在读取失败的情况下返回该参数指定的值。

--5.设置键值的方法原型如下:
public object SetValue(string name,object value);

2.以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作
--1.读取指定名称的注册表的值

private string GetRegistData(string name)
{
   
string registData;
    RegistryKey hkml
= Registry.LocalMachine;
    RegistryKey software
= hkml.OpenSubKey("SOFTWARE",true);
    RegistryKey aimdir
= software.OpenSubKey("XXX",true);
    registData
= aimdir.GetValue(name).ToString();
   
return registData;
}

以上是读取的注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下的XXX目录中名称为name的注册表值;

--2.向注册表中写数据

private void WTRegedit(string name,string tovalue)
{
    RegistryKey hklm
= Registry.LocalMachine;
    RegistryKey software
= hklm.OpenSubKey("SOFTWARE",true);
    RegistryKey aimdir
= software.CreateSubKey("XXX");
    aimdir.SetValue(name,tovalue);
}

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项;

--3.删除注册表中指定的注册表项

private void DeleteRegist(string name)
{
   
string[] aimnames;
    RegistryKey hkml
= Registry.LocalMachine;
    RegistryKey software
= hkml.OpenSubKey("SOFTWARE",true);
    RegistryKey aimdir
= software.OpenSubKey("XXX",true);
    aimnames
= aimdir.GetSubKeyNames();
   
foreach(string aimKey in aimnames)
    {
    
if(aimKey == name)
      aimdir.DeleteSubKeyTree(name);
    }
}

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中删除名称为name注册表项;

--4.判断指定注册表项是否存在

private bool IsRegeditExit(string name)
{
   
bool _exit = false;
   
string[] subkeyNames;
    RegistryKey hkml
= Registry.LocalMachine;
    RegistryKey software
= hkml.OpenSubKey("SOFTWARE",true);
    RegistryKey aimdir
= software.OpenSubKey("XXX",true);
    subkeyNames
= aimdir.GetSubKeyNames();
   
foreach(string keyName in subkeyNames)
    {
    
if(keyName == name)
     {
        _exit
= true;
       
return _exit;
     }
    }
   
return _exit;
}

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时判断是否已经存在,在新建一注册表项时也应有相应判断;


   下面的例子提供了在C#里操作注册表的方法:

    using Microsoft.Win32;
    
using System.Diagnostics;
    
private void Access_Registry()
     {
         
// 在HKEY_LOCAL_MACHINESoftware下建立一新键,起名为MCBInc
             RegistryKey key = Registry.LocalMachine.OpenSubKey("Software", true);
         
// 增加一个子键
             RegistryKey newkey = key.CreateSubKey("MCBInc");

         
// 设置此子键的值
             newkey.SetValue("MCBInc", "NET Developer");

        
// 从注册表的其他地方获取数据

         
// 找出你的CPU
             RegistryKey pRegKey = Registry.LocalMachine;
             pRegKey
= pRegKey.OpenSubKey("HARDWARE\DESCRIPTION\System\CentralProcessor\0");
             Object val
= pRegKey.GetValue("VendorIdentifier");
             Debug.WriteLine(
"The central processor of this machine is:"+ val);
         
// 删除键值
             RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software", true);
             delKey.DeleteSubKey(
"MCBInc");
     }

访问系统注册表获取ODBC数据服务列表

    //定义注册表子Path
    string strRegPath = @"SOFTWAREODBCODBC.INIODBC Data Sources";
    
//创建两个RegistryKey类,一个将指向Root Path,另一个将指向子Path
     RegistryKey regRootKey;
     RegistryKey regSubKey;
    
//定义Root指向注册表HKEY_LOCAL_MACHINE节点
     regRootKey = Registry.LocalMachine;

     regSubKey
= regRootKey.OpenSubKey(strRegPath);
    
string[] strDSNList = regSubKey.GetValueNames();
    
    
//关闭
     regSubKey.Close();
     regRootKey.Close();    

 

本文來自: http://bbs.nou.com.cn/thread-124540-1-1.htmlhttp://blog.zjol.com.cn/html/15/173915-138604.htmlhttp://www.builder.com.cn/2007/0927/527087.shtmlhttp://www.host01.com/article/Net/00020007/20060917184000172.htm


 




[本日志由 岸上的鱼 于 2008-12-16 08:16 PM 编辑]
文章来自: alocne
引用通告: 查看所有引用 | 我要引用此文章
Tags: .NET 注册表
评论: 0 | 引用: 0 | 查看次数: 3747
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭