在应用程序安装时, 常常需要利用注册表来登记应用程序的名称 、运行路径、 用户对应用程序的配置信息等 。许多应用程序在运行时也常常需要访问注册表。
.Net 框架结构在 Microsoft.Win32 名字空间内提供了两个类用于注册表操作:Registry 和RegistryKey 。这两个类都是密封类, 不允许被其它类继承。
Registry 类中提供了 7 个公有的静态域 ,分别代表 Windows 注册表中的 7 个基本主键 。它们是:
Registry.ClassesRoot 对应于 HKEY_CLASSES_ROOT 主键。
Registry.CurrentUser 对应于 HKEY_CURRENT_USER 主键。
Registry.LocalMachine 对应于 HKEY_ LOCAL_MACHINE 主键。
Registry.Users 对应于 HKEY_USERS 主键。
Registry.CurrentConfig 对应于 HKEY_CURRENT_CONFIG 主键
Registry.DynDta 对应于 HKEY_DYN_DATA 主键
Registry.PerformanceData 对应于 HKEY_ PERFORMANCE_DATA 主键
RegistryKey类中封装了对 Windows 注册表的基本操作。 对注册表的操作必须符合系统提供的权限 ,否则不能完成指定的操作, 程序将抛出一个异常。
创建子键
创建子键的成员方法的原型为:
C#代码
public RegistryKey CreateSubKey(string subkey);
其中 ,参数 subkey 表示要创建的子键的名字或子键的全路径名 。如果创建成功,返回值就是被创建的子键 ,否则为null。
打开子键
打开子键的成员方法原型为:
C#代码
public RegistryKey OpenSubKey(string name);
public RegistryKey OpenSubKey(string name, bool writable);
name 参数表示要打开的子键名称或全路径名 ,writable 参数表示被打开的主键是否可以被修改。第一个方法对打开的子键默认是只读的, 如果希望对打开的主键进行写操作 ,使用第二个方法 并把writable参数值设为true。命名空间 Microsoft.Win32 中还为我们提供了另一个方法 ,用于打开远程机器上的注册表进行操作 。方法原型为:
C++代码
public static RegistryKey OpenRemoteBaseKey( RegistryHive hKey, string machineName);
删除子键
DeleteSubKey方法用于删除指定的子键 ,方法原型为:
C#代码
public void DeleteSubKey (string subkey);
使用 DeleteSubKey 方法时,如果子键之中还包含子键 ,则删除失败 ,并返回一个异常。 如果要彻底删除子键目录,即删除子键以及子键以下的全部子键,可以使用DeleteSubKeyTree方法 。该方法原型为:
C#代码
public void DeleteSubKeyTree(string subkey);
读取键值
读键的方法原型为:
C#代码
public object GetValue(string name);
public object GetValue(string name, object defaultValue);
name 参数表示键的名称, 返回类型是一个 object 类型。 如果方法中指定的键不存在 ,则方法返回一个 null。 我们在使用 GetValue 方法时, 可以不必关心该键的值类型究竟是字符串 、二进制还是DWORD类型, 只要使用正确的返回类型就可以了。 比如,我们希望读取一个字符串类型的键值, 代码就可以这样写:
C#代码
string s_value = key.GetValue(“Type”);
其中key表示一个主键。如果不确定键值是否存在 ,而又不希望得到一个 null 返回值, 那就使用第二个方法GetValue(string name, object defaultValue), 其中的参数defaultValue表示默认的返回值 。如果读取失败, 返回值就是传递给参数defaultValue的值。
设置键值
设置键值的方法原型为:
C#代码
public void SetValue(string name, object value);
同样 ,我们在使用该方法修改键值时,不用费心去分辨究竟该传递哪种值类型,方法将会识别是哪种类型, 并把相应类型的值赋予指定的键。
1.读取指定名称的注册表的值
C#代码
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.向注册表中写数据
C#代码
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.删除注册表中指定的注册表项
C#代码
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.判断指定注册表项是否存在
C#代码
private bool IsRegeditExit(string name)
{
bool _exit = false;
try
{
string[] subkeyNames;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);
RegistryKey aimdir = software.OpenSubKey("Weather", true); /由此可判断Weather路径是否存在
subkeyNames = aimdir.GetValueNames();
foreach (string keyName in subkeyNames)
{
if (keyName == name)
{
_exit = true;
return _exit;
}
}
}
catch
{ }
return _exit;
}
以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;
一个例子:
C#代码
using Microsoft.Win32;
using System.Diagnostics;
private void Access_Registry()
{
// 在HKEY_LOCAL_MACHINE\Software下建立一新键,起名为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");
}
以上内容转摘自(CNode.CN)详细出处请参考:http://www.cnode.cn/article.asp?id=308