|
注冊表是每個Windows系統(tǒng)的重要組成部分。它包含與操作系統(tǒng)配置,硬件和所安裝軟件有關(guān)的大量信息。在.NET出現(xiàn)前,通過編程訪問注冊表要應(yīng)用Windows API(應(yīng)用程序接口)。.NET Framework通過Microsoft.Win32命名空間簡化了這一過程。本文詳細說明如何通過.NET操作注冊表。
注冊表概述
Windows注冊表呈樹狀或?qū)哟谓Y(jié)構(gòu)。Windows提供注冊表編輯器(regedt32.exe/regedit/exe)對其進行編輯。注冊表由包含所有數(shù)據(jù)的鍵構(gòu)成。這些鍵不能被刪除或重命名。下表概括說明了這些鍵:
- HKEY_CURRENT_USER:保存當前登錄用戶的配置信息。用戶的文件夾、屏幕顏色和控制面板設(shè)置都存儲在這個鍵中(也可稱作用戶基本資料)。它是HKEY_USERS的一個子鍵。
- HKEY_USERS:這個鍵中包含計算機上所有用戶的基本資料。
- HKEY_LOCAL_MACHINE:這個鍵包含計算機的配置信息。
- HKEY_CLASSES_ROOT:這個鍵包含文件關(guān)聯(lián)信息。也就是說,它告訴Windows打開特定類型的文件應(yīng)使用何種程序。它是HKEY_LOCAL_MACHINE\Software的一個子鍵。
- HKEY_CURRENT_CONFIG:這個鍵包含計算機硬件信息。
- HKEY_PERFORMANCE_DATA:在安裝軟件時,每個軟件組件為它的對象和計數(shù)器建立鍵,并在執(zhí)行時寫入計數(shù)器數(shù)據(jù)。這種性能數(shù)據(jù)存儲在這個鍵中。
這些鍵能夠以各種方式存儲數(shù)據(jù)。在注冊表中,共有六個數(shù)據(jù)類型可用來存儲數(shù)據(jù)。這些數(shù)據(jù)類型如下表所示:
- REG_BINARY:以一串十六進制數(shù)對存儲的二進制數(shù)據(jù),每個數(shù)對的值在0-255之間。REG_BINARY的長度不固定。
- REG_DWORD:它為雙字數(shù)據(jù)類型,由四個字節(jié)(32位)的數(shù)字組成,其值在0-4GB之間。設(shè)備驅(qū)動器和服務(wù)參數(shù)通常為此數(shù)據(jù)類型。
- REG_EXPAND_SZ:這個可擴充的字符串數(shù)據(jù)類型實際上是一個變量。在使用時,當字符串被系統(tǒng)調(diào)用時,它的值被真正的值代替。
- REG_MULTI_SZ:多個字符串值,不同的值用空格、逗號和其它符號隔開。
- REG_SZ:固定長度的文字字符串值。
- REG_FULL_RESOURCE_DESCRIPTOR:它用于硬件注冊表鍵中。
了解了注冊表的基礎(chǔ)知識,你就能夠利用適當?shù)?NET類來處理注冊表的內(nèi)容。
處理注冊表
Microsoft.Win32命名空間為處理注冊表提供必要的類。命名空間中的兩個主要的類為Registry和RegistryKey。Registry聯(lián)合RegistryKey一起訪問個別的注冊表鍵。它映射到前面列出的主要注冊表鍵。
- Registry.CurrentUser
- Registry.Users
- Registry.LocalMachine
- Registry.ClassesRoot
- Registry.CurrentConfig
- Registry.PerformanceData
RegistryKey類利用前面列表中的一個Registry類項目來訪問單個的注冊表鍵。下面的C# Windows應(yīng)用程序代碼顯示ClassesRoot注冊表鍵中一個特殊條目的信息。
RegistryKeyrootKey = Registry.ClassesRoot;
rootKey = rootKey.OpenSubKey(".doc", true);
MessageBox.Show(rootKey.GetValue("").ToString());
MessageBox.Show(rootKey.GetValue("Content Type").ToString());
foreach(string sub in rootKey.GetSubKeyNames()) {
MessageBox.Show(sub);
RegistryKeytmp = rootKey.OpenSubKey(sub);
MessageBox.Show(tmp.Name);
}
foreach(string test in rootKey.GetValueNames()) {
MessageBox.Show(rootKey.GetValue(test).ToString());
}
代碼參考正確的命名空間以利用注冊表類。
using Microsoft.Win32;
代碼訪問ClassesRoot鍵(.doc)中的特定子鍵。該鍵對系統(tǒng)如何處理帶特定文件擴展名(.doc)的文件進行定義。前兩個消息對話框語句顯示鍵本身的信息。提交到RegistryKey類GetValue方法的空值顯示默認鍵值。第二個消息對話框顯示與鍵有關(guān)的內(nèi)容類型(MIME類型)。
第一個foreach塊顯示注冊表鍵中所有子鍵的名稱。第二個foreach塊顯示與前兩個消息對話框語句一樣的信息,但使用GetValueNames方法獲得同樣的結(jié)果(所以你不必知道項目的名稱)。
對應(yīng)的VB.NET代碼如下:
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
Dim regSubKey As RegistryKey
Dim subk As String, test As String
Dim tmp As RegistryKey
rootKey = rootKey.OpenSubKey(".doc", True)
MessageBox.Show(rootKey.GetValue("").ToString())
MessageBox.Show(rootKey.GetValue("Content Type").ToString())
For Each subk In rootKey.GetSubKeyNames()
MessageBox.Show(subk)tmp = rootKey.OpenSubKey(subk)
MessageBox.Show(tmp.Name)
Next
or Each test In rootKey.GetValueNames()
MessageBox.Show(rootKey.GetValue(test).ToString())
Next
注:子鍵名不區(qū)分大小寫。
增加注冊表值
查閱注冊表值不錯,但有時候你需要增加注冊表值。通常,應(yīng)用程序把注冊表當作存儲應(yīng)用程序相關(guān)數(shù)據(jù)的中央倉庫。這種方法可以接受,但為避免系統(tǒng)或應(yīng)用程序出現(xiàn)問題,我們不建議修改Windows系統(tǒng)或其它應(yīng)用程序的值。
RegistryKey類中包含CreateSubKey方法,可用它來增加特定注冊表鍵元素的子鍵。另外,SetValue方法允許你增加鍵的項目與值。下面的實例給HKEY_CLASSES_ROOT鍵增加了一個子鍵。給鍵增加空白值設(shè)定了它的默認鍵值。
RegistryKeyrootKey = Registry.ClassesRoot;
RegistryKeyregSubKey;
rootKey = rootKey.OpenSubKey(".doc", true);
regSubKey = rootKey.CreateSubKey ("Newsletter");
regSubKey.SetValue("Site", "www.techrepublic.com");
regSubKey.SetValue("", "Test Link");
對應(yīng)的VB.NET代碼如下:
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
Dim regSubKey As RegistryKey
rootKey = rootKey.OpenSubKey(".doc", True)
regSubKey = rootKey.CreateSubKey("Newsletter")
regSubKey.SetValue("Site", "www.techrepublic.com")
regSubKey.SetValue("", "Test Link")
用DeleteSubKey方法可以方便地刪除鍵,所以我們可以用下面的VB.NET代碼輕松刪除新建的子鍵。
Dim rootKey As RegistryKey
rootKey = Registry.ClassesRoot
rootKey = rootKey.OpenSubKey(".doc", True)
rootKey.DeleteSubKey("Newsletter")
另外,DeleteSubKeyTree方法允許你刪除一個子鍵和遞歸子級子鍵。
警告
注冊表是Windows中最重要的組件。因此,在處理其內(nèi)容時,你應(yīng)該極度小心;因為無意改變系統(tǒng)或應(yīng)用程序鍵可能會造成系統(tǒng)或應(yīng)用程序故障。但是,注冊表可作為一個存儲點,用來存儲你所開發(fā)的應(yīng)用程序的專用數(shù)據(jù)。幸運的是,不管你應(yīng)用哪種語言,用.NET Framework處理注冊表都比較容易。
|