一.註冊表巢
在註冊表中,最上面的節點是註冊表巢(registry hive)。
HKEY_CLASSES_ROOT(HKCR) 包含系統文件類型的細節,以及應用程序可以打開的文件類型,它還包含所有COM組件的註冊信息。
HKEY_CURRENT_USER(HKCU) 包含用戶目前登陸的機器的用戶配置,包括桌面設置、環境變量、網絡和打印機連接和其他定義用戶操作環境的變量。
HKEY_LOCAL_MACHINE(HKLM) 是一個很大的巢,其中包含所有安裝到機器上的軟件和硬件的信息。
HKEY_USERS(HKUSR) 包含所有用戶的用戶配置。
HKEY_CURRENT_CONFIG(HKCF) 包含機器上硬件的信息。
二.註冊表類及常用屬性和函數
using Microsoft.Win32;
這個命名空間包含了註冊表相關的類。Registry類、RegistryKey類。
Registry類封裝了註冊表的七個基本主鍵:
Registry.ClassesRoot | 對應於HKEY_CLASSES_ROOT主鍵 |
Registry.CurrentUser | 對應於HKEY_CURRENT_USER主鍵 |
Registry.LocalMachine | 對應於 HKEY_LOCAL_MACHINE主鍵 |
Registry.User | 對應於 HKEY_USER主鍵 |
Registry.CurrentConfig | 對應於HEKY_CURRENT_CONFIG主鍵 |
Registry.DynDa | 對應於HKEY_DYN_DATA主鍵 |
Registry.PerformanceData | 對應於HKEY_PERFORMANCE_DATA主鍵 |
RegistryKey類封裝了對註冊表的基本操作。包括讀、寫、刪等操作的常用函數:
Name | 鍵的名稱(只讀) |
SubKeyCount | 鍵的子鍵個數 |
ValueCount | 鍵包含的值的個數 |
Close() | 關閉鍵 |
CreateSubKey() | 創建給定名稱的子鍵 |
DeleteSubKey() | 刪除指定的子鍵 |
DeleteSubKeyTree() | 遞歸刪除子鍵及其所有的子鍵 |
DeleteValue() | 從鍵中刪除一個指定的值 |
GetAccessControl() | 返回指定註冊表鍵的訪問控制表 |
GetSubKeyNames() | 返回包含子鍵名稱的字符串數組 |
GetValue() | 返回指定的值 |
GetValueKind() | 返回指定的值,檢索其註冊表數據類型 |
GetValueNames() | 返回一個包含所有鍵值名稱的字符串數組 |
OpenSubKey() | 返回表示給定子鍵的RegistryKey實例引用 |
SetAccessControl() | 把訪問控制表(ACL)應用於指定的註冊表鍵 |
SetValue() | 設置指定的值 |
三 註冊表項的創建、打開、刪除 1,創建
//使用CreateSubKey()在SOFTWARE下創建子項test RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.CreateSubKey(@"SOFTWARE\test"); hklm.Close(); hkSoftWare.Close();
2,打開
//使用OpenSubKey()打開項,獲得RegistryKey對象,當路徑不存在時,爲Null。第二個參數爲true,表示可寫,可讀,可刪;省略時只能讀。 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true); hklm.Close(); hkSoftWare.Close();
3,刪除
//主要用到了DeleteSubKey(),刪除test項 RegistryKey hklm = Registry.LocalMachine; hklm.DeleteSubKey(@"SOFTWARE\test", true); //爲true時,刪除的註冊表不存在時拋出異常;當爲false時不拋出異常。 hklm.Close();
四、註冊表鍵值的創建、打開和刪除
1,創建
//主要用到了SetValue(),表示在test下創建名稱爲Name,值爲RegistryTest的鍵值。第三個參數表示鍵值類型,省略時,默認爲字符串 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true); hkSoftWare.SetValue("Name", "RegistryTest", RegistryValueKind.String); hklm.Close(); hkSoftWare.Close();
2,打開
//主要用到了GetValue(),獲得名稱爲"Name"的鍵值 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true); string sValue = hkSoftWare.GetValue("Name").ToString(); hklm.Close(); hkSoftWare.Close();
3,刪除
//主要用到了DeleteValue(),表示刪除名稱爲"Name"的鍵值,第二個參數表示是否拋出異常 RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true); hkSoftWare.DeleteValue("Name", true); hklm.Close(); hkSoftWare.Close();
五、判斷註冊表項、註冊表鍵值是否存在
//判斷註冊表項是否存在 private bool IsRegistryKeyExist(string sKeyName) { string[] sKeyNameColl; RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE"); sKeyNameColl = hkSoftWare.GetSubKeyNames(); //獲取SOFTWARE下所有的子項 foreach (string sName in sKeyNameColl) { if (sName == sKeyName) { hklm.Close(); hkSoftWare.Close(); return true; } } hklm.Close(); hkSoftWare.Close(); return false; } //判斷鍵值是否存在 private bool IsRegistryValueNameExist(string sValueName) { string[] sValueNameColl; RegistryKey hklm = Registry.LocalMachine; RegistryKey hkTest = hklm.OpenSubKey(@"SOFTWARE\test"); sValueNameColl = hkTest.GetValueNames(); //獲取test下所有鍵值的名稱 foreach (string sName in sValueNameColl) { if (sName == sValueName) { hklm.Close(); hkTest.Close(); return true; } } hklm.Close(); hkTest.Close(); return false; }
六、程序自啓動程序
//開啓程序自啓動 string path = Application.ExecutablePath; RegistryKey rk = Registry.LocalMachine; RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"); rk2.SetValue("JcShutdown", path); rk2.Close(); rk.Close(); //關閉程序自啓動 string path = Application.ExecutablePath; RegistryKey rk = Registry.LocalMachine; RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"); rk2.DeleteValue("JcShutdown", false); rk2.Close(); rk.Close();