【轉載】 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;
}
相關文章
相關標籤/搜索