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