從視窗95開始,微軟公司就在視窗系統中引入了注冊表這個概念。注冊表到底是什麼東東呢?它是視窗系統的一個核心的數據庫,在這個數據庫中存放中與系統相關的各種參數,這些參數直接控制中系統的啟動、硬件的驅動程序安裝信息以及在視窗系統上運行的各種應用程序的注冊信息等。這就意味著,如果注冊表因為某些原因受到了破壞,輕者是視窗系統啟動過程出現異常,重者就有可能導致整個系統的完全癱瘓。所以正確的認識注冊表,及時的備份注冊表,對於視窗用戶就顯得相當重要。
Vsiaul C#就可以十分方便、簡潔的開發出操作注冊表的程序。本文就是介紹如何利用VisualC#來讀取注冊表中的信息。
一.初步認識注冊表:
單擊"開始/運行",在"打開"的後面填入"regedit"。就可以看到注冊表的數據結構了。如下圖。注:Regedit文件是微軟公司提供給用戶編輯注冊表的一個工具。

圖01:注冊表結構圖示
如上圖左邊的部分在注冊表中稱為"主鍵",據圖可見,"主鍵"是有層次結構的。主鍵的下一級主鍵稱為該主鍵的"子鍵"。每一個主鍵可以對擁有多個子鍵。如圖所示,右邊的這些值就是所謂的鍵值了。每一個主鍵或者子鍵都可以擁有多個鍵值。注冊表是一個龐大的數據庫,在其中每一個主鍵,每一個鍵值都賦予了不同的功能。
二.Visual C#如何讀取注冊表中的主鍵和鍵值:
在.Net FrameWork SDK Beta 2版中,有一個Microsoft.Win32的名稱空間,在此名稱空間中提供了二個用於注冊表操作的類:Registry類、RegistryKey類。這二個類都是封閉類,不可以繼承。在這二個類,定義了許多關於注冊表的方法和屬性,通過調用這二個類,在Visual C#中就可以比較輕松的處理關於注冊表的各種操作了。
(1).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主鍵
(2).RegistryKey類:
此類中主要封裝了對視窗系統注冊表的基本操作。在程序設計中,首先通過Registry類找到注冊表中的基本主鍵,然後通過RegistryKey類,來找其下面的子鍵和處理具體的操作的。
三.通過一個讀取注冊表信息例子來具體說明這二個來的用法:
(1).程序設計和運行的環境:
I視窗系統2000服務器版
II Net FrameWork SDK Beta 2版
(2)在運行程序前的一些必要的處理工作:
在程序設計時,主要功能是讀取已經存在的主鍵鍵值,用戶可以按照下圖所示的結構新建若干個主鍵和對應的鍵值:

圖02:程序設計中要讀取的注冊表的信息
這裡有必要說明的是上圖只顯示了"新項 #3"子鍵對應的鍵值。在"新項 #2"子鍵也有鍵值,對應的鍵值是:"新值#1"為"001","新值 #2"為"002"。在"新項 #1"子鍵中對應的鍵值是:"新值 #1"為"aaa","新值 #2"為"bbb"。
(3).程序的主要功能:
程序的主要功能是讀取指定主鍵下面的所有子鍵和子鍵擁有的鍵值,並以列表的形式按層次顯示出來,下圖是本程序運行後界面:

圖03:讀取注冊表信息並以列表形式顯示出來
(4).程序設計過程中的重要步驟以及應該注意的一些問題:
I 程序中讀取主鍵、子鍵和鍵值所使用到的方法:
程序中為了讀取指定主鍵下面的子鍵和子鍵中擁有的鍵值,主要使用了RegistryKey類中的四個方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具體的用法和意思如下:
OpenSubKey ( string name )方法主要是打開指定的子鍵。
GetSubKeyNames ( )方法是獲得主鍵下面的所有子鍵的名稱,它的返回值是一個字符串數組。
GetValueNames ( )方法是獲得當前子鍵中的所有的鍵名稱,它的返回值也是一個字符串數組。
GetValue ( string name )方法是指定鍵的鍵值。
程序中具體的使用語句如下:
1 RegistryKey hklm = Registry.LocalMachine ;
2 //打開"SYSTEM"子鍵
3 RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ;
4 //打開"001"子鍵
5 RegistryKey no1 = software.OpenSubKey ( "001" ) ;
6 //打開"002"子鍵
7 RegistryKey no2 = no1.OpenSubKey ( "002" ) ;
其中listBox1是程序中定義了的列表名稱。
II 如何用列表形式顯示注冊信息:
由於GetSubKeyNames ( )方法和GetValueNames ( )方法的返回值是字符串數組,所以在程序中是通過foreach語句實現遍歷這些字符串數組的。並且在遍歷的時候,就通過列表形式顯示出來,程序中具體實現語句如下:
1

//開始遍歷由子鍵名稱組成的字符串數組
2

foreach ( string site in no2.GetSubKeyNames ( ) )
3



{
4

//在列表中加入子鍵名稱
5

listBox1.Items.Add ( site ) ;
6

//打開此子鍵
7

RegistryKey sitekey = no2.OpenSubKey ( site ) ;
8

//開始遍歷由指定子鍵擁有的鍵值名稱組成的字符串數組
9

foreach ( string sValName in sitekey.GetValueNames ( ) )
10


{
11

//在列表中加入鍵名稱和對應的鍵值
12

listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ;
13

}
14

}
(5).源程序代碼:
通過以上的論述,我們可以得到程序的源程序代碼,具體如下:
1

using System;
2

using System.Drawing;
3

using System.Collections;
4

using System.ComponentModel;
5

using System.Windows.Forms;
6

using System.Data;
7

using Microsoft.Win32;
8

public class Form1 : Form
9



{
10

private System.ComponentModel.Container components;
11

private ListBox listBox1;
12

private Button button1;
13

public Form1()
14


{
15

InitializeComponent();
16

}
17

//清除在程序中使用過的資源
18

public override void Dispose()
19

{
20

base.Dispose();
21

components.Dispose();
22

}
23

//初始化程序中使用到的組件
24

private void InitializeComponent()
25


{
26

this.components = new System.ComponentModel.Container();
27

this.button1 = new Button();
28

this.listBox1 = new ListBox();
29

button1.Location = new System.Drawing.Point(16, 320);
30

button1.Size = new System.Drawing.Size(75, 23);
31

button1.TabIndex = 0;
32

button1.Text = "讀取注冊表";
33

button1.Click += new System.EventHandler(this.button1_Click);
34

listBox1.Location = new System.Drawing.Point(16, 32);
35

listBox1.Size = new System.Drawing.Size(496, 264);
36

listBox1.TabIndex = 1;
37

this.Text = "讀取主測表信息";
38

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
39

this.ClIEntSize = new System.Drawing.Size(528, 357);
40

this.Controls.Add(this.listBox1);
41

this.Controls.Add(this.button1);
42

}
43

protected void b
utton1_Click(object sender, System.EventArgs e)
44


{
45

listBox1.Items.Clear();
46

RegistryKey hklm = Registry.LocalMachine;
47

RegistryKey software = hklm.OpenSubKey("SYSTEM");
48

//打開"SYSTEM"子鍵
49

RegistryKey no1 = software.OpenSubKey("001");
50

//打開"001"子鍵
51

RegistryKey no2 = no1.OpenSubKey("002");
52

//打開"002"子鍵
53

foreach (string site in no2.GetSubKeyNames())
54

//開始遍歷由子鍵名稱組成的字符串數組
55


{
56

listBox1.Items.Add(site);
57

//在列表中加入子鍵名稱
58

RegistryKey sitekey = no2.OpenSubKey(site);
59

//打開此子鍵
60

foreach (string sValName in sitekey.GetValueNames())
61

//開始遍歷由指定子鍵擁有的鍵值名稱組成的字符串數組
62


{
63

listBox1.Items.Add("" + sValName + ": " + sitekey.GetValue(sValName));
64

//在列表中加入鍵名稱和對應的鍵值
65

}
66

}
67

}
68

public static void Main()
69


{
70

Application.Run(new Form1());
71

}
72

}
四.總結:
用Visual C#來讀取注冊表中的注冊信息是通過名稱空間Micorsoft.Win32中的二個類來實現的。在這二個類中還定義了對注冊表信息的刪除、修改和重命名的一些方法。這些方法比起本文介紹的讀取方法、打開方法來說,更具有破壞性,但也更實用。對應這些方法的介紹將在以後的文章中進行。
通過以上的介紹,我們發現用Visual C#來處理注冊表,其實是一件比較輕松而簡單的事情。事情雖然是輕松的,但我也要提醒各位,由於注冊表在視窗系統中的重要作用,所以在每一次對注冊表進行操作之前,一定要備份,在操作的時候也要非常小心,因為你的每一次的誤操作都可能導致你的系統崩潰。