閱讀546 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 係統應用之注冊表使用詳解

        在平時做項目時,我們有時會遇到注冊表的操作,例如前麵我們需要獲取IE瀏覽器地址欄的信息、獲取"我的電腦"地址欄輸入的文件夾信息、USB最近使用信息等.注冊表項是注冊表的基本組織單位,它包含子表項和值條目.簡言之,注冊表項相當於注冊表裏的文件夾.它們存儲計算機安裝程序的信息,如顏色設置、屏幕大小、曆史記錄等.
        舉個以前使用注冊表最多的例子:當我們玩魔獸或dota時,總需要打開"運行"->輸入"regedit"打開注冊表,在HKEY_CURRENT_USER->Software->Blizzard Entertainment->Warcraft III->Video中修改reswidth(屏幕寬)和resheight(屏幕高).使其屏幕分辯率與遊戲一致全屏顯示.
        下麵就詳細講解注冊表的使用.
一.注冊表的結構
       
注冊表(registry)是Windows係統中一個重要的數據庫,它用於存儲有關應用程序、用戶和係統信息.注冊表的結構就像一顆樹.樹的頂級節點(hive)不能添加、修改和刪除.
       
如下圖所示是Windows注冊表的頂級節點:

        在C#中對注冊表進行操作,需要引用命名空間:using Microsoft.Win32.
       
RegistryKey類表示注冊表中的頂級結點,此類是注冊表的封裝.
       
Registry類提供表示Windows注冊表中的根項RegistryKey對象,並提供訪問項/值的static方法.常用的Registry對象的頂級節點(蜂窩,hive)的屬性如下表所示:

Registry屬性 注冊表頂級節點 說明
ClassessRoot HKEY_CLASSES_ROOT 定義文檔的類型\類以及與類型關聯的信息以及COM組件的配置數據
CurrentConfig HKEY_CURRENT_CONFIG 包含有關非用戶特定的硬件的配置信息
CurrentUser HKEY_CURRENT_USER 包含當前登錄到Windows的用戶的配置信息
LocalMachine HKEY_LOCAL_MACHINE 包含與計算機相關的配置信息,不管用戶是否登錄
Users HKEY_USERS 包含有關默認用戶配置的信息

        注冊表中常用的數據類型有:
        REG_SZ字符串數據的主要類型,用於存儲固定長度的字符串或其他短文本值.我們在實際程序中通常隻用這種數據類型,如果要保存布爾值時,將它表示成0或1.
        REG_BINARY用於存儲二進製數據.
        REG_EXPAND_SZ可擴展的字符串值,可以保存在運行時才解析的係統變量.
        REG_MULTI_SZ以數組的格式保存多個文本字符串,每個字符串"元素"都以null字符結束.
二.注冊表常用方法
          1.創建注冊表鍵
       
首先先確定在哪個頂級結點下創建鍵,然後調用CreateSubKey()方法創建.

public RegistryKey CreateSubKey(
	string subkey   //要創建或打開的子項的名稱或路徑
 )

        例如在HKEY_CURRENT_USER下創建鍵Eastmount和HKEY_CURRENT_USER\Software\Eastmount\test2.其中我們最常用的是在\Software這個鍵下創建程序產品鍵,保存一些程序的配置在注冊表中.如果Software中沒有Eastmount鍵,則會先創建這個鍵及其子鍵.如果存在就不會重寫.

//創建鍵
//在HKEY_CURRENT_USER下創建Eastmount鍵
RegistryKey test1 = Registry.CurrentUser.CreateSubKey("Eastmount");
//創建鍵結構 HKEY_CURRENT_USER\Software\Eastmount\test2
RegistryKey test2 = Registry.CurrentUser.CreateSubKey(@"Software\Eastmount\test2");

        注意:C#字符串中反斜杠是轉義字符,前麵加前綴@時,告訴字符串按字麵值處理而不進行轉義.@"Software\Eastmount\test2"="Software\\Eastmount\\test2".
        運行結果如下:

 
        2.打開子鍵

public RegistryKey OpenSubKey(
	string name,     //要打開的子項名稱或路徑
	bool writable    //如果需要項的寫訪問權限=true
)

        3.刪除注冊表的鍵
      刪除注冊表的鍵有兩個方法: DeleteSubKey()和DeleteSubKeyTree().DeleteSubKey()刪除不包括子鍵的鍵及其所有值,DeleteSubKeyTree()不僅刪除鍵及其值,還刪除鍵下所有子鍵(慎用該方法).

//函數原型
public void DeleteSubKey(
	string subkey    //要刪除的子項名稱
)
//刪除HKEY_CURRENT_USER下創建Eastmount鍵
Registry.CurrentUser.DeleteSubKey("Eastmount");
//刪除創建的子鍵test2
Registry.CurrentUser.DeleteSubKey(@"Software\Eastmount\test2");

        如果鍵不存在,會有異常錯誤提示,最好使用try..catch..異常處理.它僅僅刪除Software\Eastmount中子項test2而保留Eastmount項.結果如下圖所示:

         注意:如果使用Registry.CurrentUser.DeleteSubKey(@"Software\Eastmount");它會提示錯誤"注冊表具有子項,並且此方法不支持遞歸移除".如果使用Registry.CurrentUser.DeleteSubKeyTree(@"Software\Eastmount")則會刪除Eastmount和子項test2.
        4.獲取鍵值
       
Registry.GetValue()檢索與指定的注冊表項中的指定名稱關聯的值.如果keyName指定的子項不存在,則返回null;否則返回與valueName關聯的值;如果未找到valueName則返回defaultValue.
public static Object GetValue(
	string keyName,        //以注冊表頂級節點開頭的鍵的完整路徑
	string valueName,      //名稱/值的名稱
	Object defaultValue    //當valueName不存在時返回的值
)

        例如獲取HKEY_CURRENT_USER\Environment中的path鍵值.

//獲取Environment中路徑
string strPath;
strPath = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Environment",
    "path", "Return this default if path does not exist");
MessageBox.Show(strPath);


        RegistryKey.GetValue方法可以檢索與指定名稱關聯的值.函數原型public object GetValue(string name).其中參數name表示鍵的名稱.如程序中我獲取計算機地址欄輸入的信息.

//定義注冊表頂級結點 命名空間Microsoft.Win32
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey
    ("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TypedPaths", true);
//判斷鍵是否存在
if (key != null)
{
    //檢索包含此項關聯的所有值名稱 即url1 url2 url3
    string[] names = key.GetValueNames();
    foreach (string str in names)
    {
        //獲取url中相關聯的值
        listBox1.Items.Add(key.GetValue(str).ToString());
        Num++;
    }
    //顯示獲取文件總數
    this.textBox1.Text = Num + "個文件";
}

        運行結果如下圖所示.其實還可以獲取很多東西,USB使用信息、瀏覽器使用信息、軟件路徑等等.

        5.創建和設置鍵值
        Registry.SetValue()方法設置指定的注冊表項的指定名稱/值對,如果指定的項不存在,則創建該項.

//函數原型
public static void SetValue(
    string keyName,        //以注冊表頂級節點開頭的鍵的完整路徑
	string valueName,      //名稱/值對的名稱
	Object value           //要存儲的值
)
//設置鍵值Version=1.25
Registry.SetValue(@"HKEY_CURRENT_USER\Software\YourSoftware", "Version", "1.25");

        注意:每次調用SetValue方法時,它都打開一個注冊表項,設置其值,然後關閉該項.如果需要大批量修改建議使用RegistryKey.SetValue方法.public object SetValue(string name,object value).
       
PS:舉個簡單的例子通過設置我的電腦-{20D04FE0-3AEA-1069-A2D8-08002B30309D}為1,即可隱藏桌麵我的電腦圖標.修改為0又可以顯示,你知不知道把文件夾添加".{20D04FE0-3AEA-1069-A2D8-08002B30309D}"後就變成了"我的電腦",可以用來隱藏文件.

RegistryKey rgK = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel");
rgK.SetValue("{20D04FE0-3AEA-1069-A2D8-08002B30309D}",1);

        最後希望文章對大家有所幫助,文章主要是自己這段時間對C#調用注冊表信息的總結,一方麵講述了注冊表相關的基礎知識,另一方麵通過代碼結合圖片格式講述簡單運用注冊表.同時如果文章中有什麼囉嗦或不足之處,還請海涵.
       
文章參考自己的項目、MSDN和
利用C#操作注冊表
(By:Eastmount 2014-5-11 夜9點半 原創CSDNhttps://blog.csdn.net/eastmount/)

最後更新:2017-04-03 12:56:38

  上一篇:go 不能被繼承的類
  下一篇:go 微信之父張小龍:怎樣做簡單的產品經理?七