【转载】 C#读写注册表

文章地址:https://blog.csdn.net/younghaiqing/article/details/61918968windows

 

 

自Windows95以来的全部Windows版本中,注册表是包含Windows安装,用户首选项,以及已安装软件和设备的全部配置信息的核心存储库。目前,几乎全部的商用软件都使用注册表来存储这些信息,COM组件必须把它们的信息存储在注册表中,才能有客户端调用。.NET Framework引入了独立存储器的概念,经过它应用程序能够在文件中存储专用于每一个用户的信息,.NET Framework将确保为每一个在机器上注册的用户单独地存储数据。

注册表的库和.NET库同样复杂,它包括访问注册表的类。其中有两个类涉及注册表,即Registry和RegistryKey,这两个类都在Microsoft Win32 名称控件中。

1.先介绍一下注册表

注册表的层次结构很是相似于文件系统的层次结构。查看和修改注册表的内容的通常方式是使用regedit或regedt32应用程序。

在运行中输入:regedit,能够看到以下界面:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2.NET 注册表类

要访问注册表,就可使用Registry和RegistryKey。

RegistryKey实例表示一个注册表键。这个类实现的方法能够浏览子键,建立新键,读取或修改键中的值。换句话说,经过这类能够实现对注册建全部的操做,包括设置键的安全级别。

Registry类只能对注册表键进行单一的访问,以执行简单的操做。Registry类的另外一个做用是提供表示顶级键的RegistryKey实例,以便开始在注册表中定位。Registry经过静态属性来提供这些实例。

那么接下来先介绍一下Registry 类

做用:提供了 RegistryKey 表示 Windows 注册表中的根键的对象和 static 方法,以访问键/值对。

Registry方法

名称 说明
GetValue(String, String, Object) 检索与指定的注册表项中具备指定名称关联的值。 若是未在指定的键中找到的名称,将返回你提供一个默认值或 null 若是指定的键不存在。
SetValue(String, String, Object) 设置指定的注册表项指定的名称/值对。 若是指定的键不存在,则建立它。
SetValue(String, String, Object, RegistryValueKind) 使用指定的注册表数据类型的指定的注册表项设置的名称/值对。 若是指定的键不存在,则建立它。

Registry字段

名称 说明
ClassesRoot 定义文档以及与这些类型相关联的属性类型 (或类)。 此字段中读取的 Windows 注册表基项 HKEY_CLASSES_ROOT。
CurrentConfig 包含与不是特定于用户的硬件相关的配置信息。 此字段中读取的 Windows 注册表基项 HKEY_CURRENT_CONFIG。
CurrentUser 包含有关当前用户首选项的信息。 此字段中读取的 Windows 注册表基项 HKEY_CURRENT_USER
DynData 已过期。 包含动态注册表数据。 此字段中读取的 Windows 注册表基项 HKEY_DYN_DATA。
LocalMachine 包含为本地计算机的配置数据。 此字段中读取的 Windows 注册表基项 HKEY_LOCAL_MACHINE。
PerformanceData 包含软件组件的性能信息。 此字段中读取的 Windows 注册表基项 HKEY_PERFORMANCE_DATA。
Users 包含有关默认用户配置信息。 此字段中读取的 Windows 注册表基项 HKEY_USERS。

3.备注

此类提供在运行 Windows 的计算机上的注册表中找到的标准的根键的集合。 注册表是有关应用程序、 用户和默认的系统设置的信息存储设施。 例如,应用程序可使用注册表来存储信息,必须关闭该应用程序以后, 被保留并从新加载应用程序时访问这些信息。 例如,您能够存储颜色首选项、 屏幕位置或窗口的大小。 经过将信息存储在注册表中的其余位置,能够控制每一个用户的此数据。

基或根 RegistryKey 实例公开的 Registry 类描述的子项和值在注册表中的基本存储机制。 全部键都是只读的由于注册表取决于它们存在。 经过公开的项 Registry 是︰

名称 说明
ClassesRoot 存储有关类型 (类) 的信息以及它们的属性。
CurrentConfig 将存储非特定于用户的硬件信息。
CurrentUser 存储有关用户首选项的信息。
DynData 将动态数据存储。
LocalMachine 存储在本地计算机的配置信息。
PerformanceData 存储软件组件的性能的信息。
Users 存储有关默认用户配置信息。

一旦肯定要在其下存储/检索信息从注册表的根密钥,您可使用 RegistryKey 类来添加或删除子项,并处理给定键的值。

硬件设备能够将信息放在使用自动插接口注册表中。 用于安装设备驱动程序软件能够经过写入到标准 Api 在注册表中放信息。

用于获取和设置值的静态方法

在.NET Framework 2.0 版中, Registry 类还包含 staticGetValue 和 SetValue 用于设置和从注册表项中检索值的方法。 这些方法都将打开和关闭注册表项的每一个使用它们,所以它们不会执行的时间以及中的相似方法 RegistryKey 类,当您访问大量的值。

RegistryKey 类还提供了容许您设置的注册表项,以进行检索以前,测试一个值的数据类型并删除注册表项的 Windows 访问控制安全性的方法。

示例

示例 1

下面的代码示例演示如何检索 HKEY_USERS 项的子项并打印到屏幕的名称。 使用 OpenSubKey 方法来建立感兴趣的特定子项的一个实例。 而后,可使用中的其余操做 RegistryKey 来操做该注册表项。

using System;
using Microsoft.Win32;

class Reg {
    public static void Main() {

        // Create a RegistryKey, which will access the HKEY_USERS
        // key in the registry of this machine.
        RegistryKey rk = Registry.Users;

        // Print out the keys.
        PrintKeys(rk);
    }

    static void PrintKeys(RegistryKey rkey) {

        // Retrieve all the subkeys for the specified key.
        String [] names = rkey.GetSubKeyNames();

        int icount = 0;

        Console.WriteLine("Subkeys of " + rkey.Name);
        Console.WriteLine("-----------------------------------------------");

        // Print the contents of the array to the console.
        foreach (String s in names) {
            Console.WriteLine(s);

            // The following code puts a limit on the number
            // of keys displayed. Comment it out to print the
            // complete list.
            icount++;
            if (icount >= 10)
                break;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

示例 2

下面的代码示例将多个数据类型的值存储在一个示例键中建立密钥,由于它这样作了,而后检索并显示的值。 该示例演示如何存储和检索默认 (无名) 的名称/值对,以及如何使用 defaultValue 名称/值对不存在时。

using System;
using Microsoft.Win32;

public class Example
{
    public static void Main()
    {
        // The name of the key must include a valid root.
        const string userRoot = "HKEY_CURRENT_USER";
        const string subkey = "RegistrySetValueExample";
        const string keyName = userRoot + "\\" + subkey;

        // An int value can be stored without specifying the
        // registry data type, but long values will be stored
        // as strings unless you specify the type. Note that
        // the int is stored in the default name/value
        // pair.
        Registry.SetValue(keyName, "", 5280);
        Registry.SetValue(keyName, "TestLong", 12345678901234,
            RegistryValueKind.QWord);

        // Strings with expandable environment variables are
        // stored as ordinary strings unless you specify the
        // data type.
        Registry.SetValue(keyName, "TestExpand", "My path: %path%");
        Registry.SetValue(keyName, "TestExpand2", "My path: %path%",
            RegistryValueKind.ExpandString);

        // Arrays of strings are stored automatically as 
        // MultiString. Similarly, arrays of Byte are stored
        // automatically as Binary.
        string[] strings = {"One", "Two", "Three"};
        Registry.SetValue(keyName, "TestArray", strings);

        // Your default value is returned if the name/value pair
        // does not exist.
        string noSuch = (string) Registry.GetValue(keyName, 
            "NoSuchName",
            "Return this default if NoSuchName does not exist.");
        Console.WriteLine("\r\nNoSuchName: {0}", noSuch);

        // Retrieve the int and long values, specifying 
        // numeric default values in case the name/value pairs
        // do not exist. The int value is retrieved from the
        // default (nameless) name/value pair for the key.
        int tInteger = (int) Registry.GetValue(keyName, "", -1);
        Console.WriteLine("(Default): {0}", tInteger);
        long tLong = (long) Registry.GetValue(keyName, "TestLong",
            long.MinValue);
        Console.WriteLine("TestLong: {0}", tLong);

        // When retrieving a MultiString value, you can specify
        // an array for the default return value. 
        string[] tArray = (string[]) Registry.GetValue(keyName,
            "TestArray",
            new string[] {"Default if TestArray does not exist."});
        for(int i=0; i<tArray.Length; i++)
        {
            Console.WriteLine("TestArray({0}): {1}", i, tArray[i]);
        }

        // A string with embedded environment variables is not
        // expanded if it was stored as an ordinary string.
        string tExpand = (string) Registry.GetValue(keyName,
             "TestExpand", 
             "Default if TestExpand does not exist.");
        Console.WriteLine("TestExpand: {0}", tExpand);

        // A string stored as ExpandString is expanded.
        string tExpand2 = (string) Registry.GetValue(keyName,
            "TestExpand2",
            "Default if TestExpand2 does not exist.");
        Console.WriteLine("TestExpand2: {0}...",
            tExpand2.Substring(0, 40));

        Console.WriteLine("\r\nUse the registry editor to examine the key.");
        Console.WriteLine("Press the Enter key to delete the key.");
        Console.ReadLine();
        Registry.CurrentUser.DeleteSubKey(subkey);
    }
}
//
// This code example produces output similar to the following:
//
//NoSuchName: Return this default if NoSuchName does not exist.
//(Default): 5280
//TestLong: 12345678901234
//TestArray(0): One
//TestArray(1): Two
//TestArray(2): Three
//TestExpand: My path: %path%
//TestExpand2: My path: D:\Program Files\Microsoft.NET\...
//
//Use the registry editor to examine the key.
//Press the Enter key to delete the key.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

2.RegistryKey 类

这里写图片描述

这里写图片描述

一:C#注册表项的建立,打开与删除

1:建立

建立注册表项主要用到RegistryKey 的CreateSubKey()方法。如:

RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.CreateSubKey("software\\test");
//在HKEY_LOCAL_MACHINE\SOFTWARE下新建名为test的注册表项。若是已经存在则不影响!
  • 1
  • 2
  • 3

2:打开

打开注册表项主要用到RegistryKey 的OpenSubKey()方法。如:

注意,若是该注册表项不存在,这调用这个方法会抛出异常

RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.OpenSubKey("software\\test",true);
//注意该方法后面还能够有一个布尔型的参数,true表示能够写入。
  • 1
  • 2
  • 3

3:删除

删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。如:

RegistryKey key = Registry.LocalMachine;
key.DeleteSubKey("software\\test",true); //该方法无返回值,直接调用便可
key.Close();
  • 1
  • 2
  • 3

注意,若是该注册表项不存在,这调用这个方法会抛出异常

二:键值的建立(设置值、修改),读取和删除

1:建立(设置值、修改)

对键值的建立修改等操做主要用到RegistryKey 的SetValue()方法

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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2:读取

string info = "";
RegistryKey Key;
Key = Registry.LocalMachine;
myreg = Key.OpenSubKey("software\\test");
// myreg = Key.OpenSubKey("software\\test",true);
info = myreg.GetValue("test").ToString();
myreg.Close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

info结果为:博客园

3:删除

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

细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其余例子的不一样。

若是你要修改键值,包括建立、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;若是仅仅只是读取键值能够不加,此时可写关闭,你不能再往里写值(固然,你要加也能够true)!

还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操做。

如:

software.SetValue(“”, “博客园”); // 在HKEY_LOCAL_MACHINE\SOFTWARE\test修改默认键值的值为“博客园”。读取相似!

另外,默认的键值是不能删除的,因此不要用DeleteValue()方法去删除,会抛出异常的!

三:判断注册表项是否存在

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;   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

四:判断键值是否存在这里写代码片

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