如何用.NET操作Windows注冊(cè)表 |
注冊(cè)表是每個(gè)Windows系統(tǒng)的重要組成部分。它包含與操作系統(tǒng)配置,硬件和所安裝軟件有關(guān)的大量信息。在.NET出現(xiàn)前,通過(guò)編程訪問(wèn)注冊(cè)表要應(yīng)用Windows API(應(yīng)用程序接口)。.NET Framework通過(guò)Microsoft.Win32命名空間簡(jiǎn)化了這一過(guò)程。本文詳細(xì)說(shuō)明如何通過(guò).NET操作注冊(cè)表。 注冊(cè)表概述 Windows注冊(cè)表呈樹(shù)狀或?qū)哟谓Y(jié)構(gòu)。Windows提供注冊(cè)表編輯器(regedt32.exe/regedit/exe)對(duì)其進(jìn)行編輯。注冊(cè)表由包含所有數(shù)據(jù)的鍵構(gòu)成。這些鍵不能被刪除或重命名。下表概括說(shuō)明了這些鍵:
這些鍵能夠以各種方式存儲(chǔ)數(shù)據(jù)。在注冊(cè)表中,共有六個(gè)數(shù)據(jù)類(lèi)型可用來(lái)存儲(chǔ)數(shù)據(jù)。這些數(shù)據(jù)類(lèi)型如下表所示:
了解了注冊(cè)表的基礎(chǔ)知識(shí),你就能夠利用適當(dāng)?shù)?NET類(lèi)來(lái)處理注冊(cè)表的內(nèi)容。 處理注冊(cè)表 Microsoft.Win32命名空間為處理注冊(cè)表提供必要的類(lèi)。命名空間中的兩個(gè)主要的類(lèi)為Registry和RegistryKey。Registry聯(lián)合RegistryKey一起訪問(wèn)個(gè)別的注冊(cè)表鍵。它映射到前面列出的主要注冊(cè)表鍵。
RegistryKey類(lèi)利用前面列表中的一個(gè)Registry類(lèi)項(xiàng)目來(lái)訪問(wèn)單個(gè)的注冊(cè)表鍵。下面的C# Windows應(yīng)用程序代碼顯示ClassesRoot注冊(cè)表鍵中一個(gè)特殊條目的信息。 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()); } 代碼參考正確的命名空間以利用注冊(cè)表類(lèi)。 using Microsoft.Win32; 代碼訪問(wèn)ClassesRoot鍵(.doc)中的特定子鍵。該鍵對(duì)系統(tǒng)如何處理帶特定文件擴(kuò)展名(.doc)的文件進(jìn)行定義。前兩個(gè)消息對(duì)話框語(yǔ)句顯示鍵本身的信息。提交到RegistryKey類(lèi)GetValue方法的空值顯示默認(rèn)鍵值。第二個(gè)消息對(duì)話框顯示與鍵有關(guān)的內(nèi)容類(lèi)型(MIME類(lèi)型)。 第一個(gè)foreach塊顯示注冊(cè)表鍵中所有子鍵的名稱(chēng)。第二個(gè)foreach塊顯示與前兩個(gè)消息對(duì)話框語(yǔ)句一樣的信息,但使用GetValueNames方法獲得同樣的結(jié)果(所以你不必知道項(xiàng)目的名稱(chēng))。 對(duì)應(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ū)分大小寫(xiě)。 增加注冊(cè)表值 查閱注冊(cè)表值不錯(cuò),但有時(shí)候你需要增加注冊(cè)表值。通常,應(yīng)用程序把注冊(cè)表當(dāng)作存儲(chǔ)應(yīng)用程序相關(guān)數(shù)據(jù)的中央倉(cāng)庫(kù)。這種方法可以接受,但為避免系統(tǒng)或應(yīng)用程序出現(xiàn)問(wèn)題,我們不建議修改Windows系統(tǒng)或其它應(yīng)用程序的值。 RegistryKey類(lèi)中包含CreateSubKey方法,可用它來(lái)增加特定注冊(cè)表鍵元素的子鍵。另外,SetValue方法允許你增加鍵的項(xiàng)目與值。下面的實(shí)例給HKEY_CLASSES_ROOT鍵增加了一個(gè)子鍵。給鍵增加空白值設(shè)定了它的默認(rèn)鍵值。 RegistryKeyrootKey = Registry.ClassesRoot; RegistryKeyregSubKey; rootKey = rootKey.OpenSubKey(".doc", true); regSubKey = rootKey.CreateSubKey ("Newsletter"); regSubKey.SetValue("Site", "www.techrepublic.com"); regSubKey.SetValue("", "Test Link"); 對(duì)應(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方法允許你刪除一個(gè)子鍵和遞歸子級(jí)子鍵。 警告 注冊(cè)表是Windows中最重要的組件。因此,在處理其內(nèi)容時(shí),你應(yīng)該極度小心;因?yàn)闊o(wú)意改變系統(tǒng)或應(yīng)用程序鍵可能會(huì)造成系統(tǒng)或應(yīng)用程序故障。但是,注冊(cè)表可作為一個(gè)存儲(chǔ)點(diǎn),用來(lái)存儲(chǔ)你所開(kāi)發(fā)的應(yīng)用程序的專(zhuān)用數(shù)據(jù)。幸運(yùn)的是,不管你應(yīng)用哪種語(yǔ)言,用.NET Framework處理注冊(cè)表都比較容易。 |
聯(lián)系客服