C# 注册表

文章目录

  • 前言
  • 一、预定义主键
  • 二、Registry和RegistryKey
    • 1.Registry类
    • 2.RegistryKey类
  • 三、注册表项的创建,打开与删除
  • 四、键值的创建(设置值、修改),读取和删除
  • 五、示例


前言

添加引用:using Microsoft.Win32;


一、预定义主键

1、HKEY_CLASSES_ROOT该主键包含了文件的扩展名和应用程序的关联信息以及Window Shell和OLE用于储存注册表的信息。该主键下的子键决定了在WINDOWS中如何显示该类文件以及他们的图标,该主键是从HKEY_LOCAL_MACHINE\SOFTWARE\Classes映射过来的。
2、HKEY_CURRENT_USER该主键包含了如用户窗口信息,桌面设置等当前用户的信息
3、HKEY_LOCAL_MACHINE主键包含了计算机软件和硬件的安装和配置信息,该信息可供所有用户使用。
4、HKEY_USERS该主键记录了当前用户的设置信息,每次用户登入系统时,就会在该主键下生成一个与用户登入名一样的子键,该子键保存了当前用户的桌面设置、背景位图、快捷键,字体等信息。一般应用程序不直接访问改主键,而是通过主键HKEY_CURRENT_USER进行访问。
5、HKEY_CURRENT_CONFIG该主键保存了计算机当前硬件的配置信息,这些配置可以根据当前所连接的网络类型或硬件驱动软件安装的改变而改变。

二、Registry和RegistryKey

C#也支持对注册表的编辑,.NET 框架提供了两个类来操作注册表:Registry和RegistryKey。这两个类都是密封类不允许被继承。

1.Registry类

Registry类提供了7个公共的静态域,分别代表7个基本主键(其中两个在XP系统中没有)分别是:
Registry.ClassesRoot对应于 HKEY_CLASSES_ROOT主键
Registry.CurrentUser 对应于 HKEY_CURRENT_USER主键
Registry.LocalMachine对应于 HKEY_LOCAL_MACHINE主键
Registry.Users对应于 HKEY_USER主键
Registry.CurrentConfig对应于 HEKY_CURRENT_CONFIG主键
Registry.DynDa 对应于HKEY_DYN_DATA主键
Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键

2.RegistryKey类

RegistryKey类中提供了对注册表操作的方法。要注意的是操作注册表必须具有管理员权限,否则将会抛出错误。

	RegistryKey key = Registry.LocalMachine;
	.....
	//最后要调用RegistryKey对象的Close()关闭对注册表的修改
	key.Close();

三、注册表项的创建,打开与删除

1、创建

	public RegistryKey CreateSubKey(string subkey);

参数subkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键,否则返回null。
例:

	RegistryKey key = Registry.LocalMachine;
	RegistryKey software = key.CreateSubKey("software\\test");

2、打开

  public RegistryKey OpenSubKey(string name);
  public RegistryKey OpenSubKey(string name,bool writable);
  //用于打开远程计算机上的注册表
  public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey,string machineName);

参数name表示要打开的子键名或其路径名,参数writable表示被打开的子键是否允许被修改,第一个方法打开的子键是只读的。
例:

	RegistryKey key = Registry.LocalMachine;
	RegistryKey software = key.OpenSubKey("software\\test",true); 

注:如果该子键不存在,直接调用该方法会抛出异常。
例:

	RegistryKey key = Registry.LocalMachine;
	RegistryKey software = key.OpenSubKey("software\\test",true);

3、删除

   //只能删除一项,且这一项没有子项
  public void DeleteSubKey(string subkey);
  //彻底删除该子键及其目录下的子键可以用方法DeleteSubKeyTree(递归删除)
  public void DeleteKeyTree(string subkey);
	 //"Boolean info"参数:值为"True"时,若删除的子键不存在,则产生一个错误信息;值为"False"时,若删除的子键不存在,也不产生错误信息,程序依然正确运行。
	public void DeleteSubKey (string subkey,Boolean info)

DeleteSubKey 方法用于删除指定的子键。如果要删除的子键还包含其他子键则删除失败,返回一个异常。
注:如果该项不存在,直接调用该方法会抛出异常。且删除前必须先打开子键,否则报错。
例:

	RegistryKey key = Registry.LocalMachine;
	RegistryKey software = key.OpenSubKey("software\\test", true);
	software.DeleteSubKey("useTime",true); //该方法无返回值,直接调用即可
	key.Close();

四、键值的创建(设置值、修改),读取和删除

1、读取键值:

	public object GetValue(string name);
	public object GetValue(string name,object defaultValue);
	public static Object GetValue(string keyName,string valueName,Object defaultValue);

参数name表示键的名称,返回类型是一个object类型,如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数defaultValue,指定了参数则在读取失败的情况下返回该参数指定的值。
keyName:以有效注册表根(如“HKEY_CURRENT_USER”)开头键的完整注册表路径。
valueName:名称/值对的名称。
defaultValue:当name不存在时返回的值。
返回值:如果由keyName指定的子项不存在,则返回null;否则,返回与valueName关联的值;或者,如果未找到valueName,则返回defaultValue。

//获取软件的使用次数:
	RegistryKey Registry = hkml.OpenSubKey("SOFTWARE\\test",true);
	tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE/SOFTWARE/tryTimes", "UseTimes", 0);

例:

	string info = "";
	RegistryKey Key;
	Key = Registry.LocalMachine;
	//创建、设置、删除键值等都要在OpenSubKey方法后面加个布尔参数,设置为true,表示可写可改;如果仅仅只是读取键值可以不加,此时可写关闭,不能再往里写值(要加也可以设置为true)
	myreg = Key.OpenSubKey("software\\test");
	// myreg = Key.OpenSubKey("software\\test",true);
	info = myreg.GetValue("test").ToString();
	myreg.Close();

2、创建(设置值、修改):

	public object SetValue(string name,object value); 
	public static void SetValue(string keyName,string valueName,Object value)
	public static void SetValue(string keyName,string valueName,Object value,RegistryValueKind valueKind)

keyName:以有效注册表根(如“HKEY_CURRENT_USER”)开头键的完整注册表路径。
valueName:名称/值对的名称。
value:要存储的值。
valueKind:存储数据时使用的注册表数据类型。

例:

	RegistryKey key = Registry.LocalMachine;
	RegistryKey software = key.OpenSubKey("software\\test",true); //该项必须已存在
	software.SetValue("test", "脚本之家");
	//在HKEY_LOCAL_MACHINE\SOFTWARE\test下创建一个名为“test”,值为“脚本之家”的键值。如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
	// 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等,默认是字符串。如:
	// software.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
	Key.Close();

读写默认键值:在设置、读取的方法中将键名置空则就是对默认键值的操作。

	software.SetValue("", "脚本之家"); // 在HKEY_LOCAL_MACHINE\SOFTWARE\test修改默认键值的值为“脚本之家”。读取类似!

3、删除键值:

	public void DeleteValue(string name) 
//name:要删除的键值的名称。

注:删除前必须先打开子键,否则报错。

	RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\test", true);
	delKey.DeleteValue("test");
	delKey.Close();

五、示例

1、判断注册表项是否存在

private bool IsRegeditItemExist() 
{ 
  	string [] subkeyNames; 
  	RegistryKey hkml = Registry.LocalMachine; 
  	RegistryKey software = hkml.OpenSubKey("SOFTWARE"); 
  	//RegistryKey software = hkml.OpenSubKey("SOFTWARE", true); 
  	subkeyNames = software.GetSubKeyNames(); 
  	//取得该项下所有子项的名称的序列,并传递给预定的数组中 
  	foreach (string keyName in subkeyNames)  
  	//遍历整个数组 
  	{ 
    	if (keyName == "test") 
    	//判断子项的名称 
    	{  
      		hkml.Close(); 
      		return true ; 
    	} 
  	} 
  	hkml.Close(); 
  	return false;  
}

2、判断键值是否存在

private bool IsRegeditKeyExit()
{
 	string[] subkeyNames;
 	RegistryKey hkml = Registry.LocalMachine;
 	RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test");
 	//RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true);
 	subkeyNames = software.GetValueNames();
 	//取得该项下所有键值的名称的序列,并传递给预定的数组中
 	foreach (string keyName in subkeyNames)
 	{
  		if (keyName == "test") //判断键值的名称
  		{
    		hkml.Close();
    		return true;
  		}
 	}
 	hkml.Close();
 	return false;
}

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);
	}
}

你可能感兴趣的:(c#,microsoft,windows)