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項.結果如下圖所示:

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