Vsiaul C#如何讀取注冊(cè)信息
發(fā)表時(shí)間:2024-05-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]從視窗95開始,微軟公司就在視窗系統(tǒng)中引入了注冊(cè)表這個(gè)概念。注冊(cè)表到底是什么東東呢?它是視窗系統(tǒng)的一個(gè)核心的數(shù)據(jù)庫,在這個(gè)數(shù)據(jù)庫中存放中與系統(tǒng)相關(guān)的各種參數(shù),這些參數(shù)直接控制中系統(tǒng)的啟動(dòng)、硬件的驅(qū)動(dòng)程序安裝信息以及在視窗系統(tǒng)上運(yùn)行的各種應(yīng)用程序的注冊(cè)信息等。這就意味著,如果注冊(cè)表因?yàn)槟承┰蚴艿搅?..
從視窗95開始,微軟公司就在視窗系統(tǒng)中引入了注冊(cè)表這個(gè)概念。注冊(cè)表到底是什么東東呢?它是視窗系統(tǒng)的一個(gè)核心的數(shù)據(jù)庫,在這個(gè)數(shù)據(jù)庫中存放中與系統(tǒng)相關(guān)的各種參數(shù),這些參數(shù)直接控制中系統(tǒng)的啟動(dòng)、硬件的驅(qū)動(dòng)程序安裝信息以及在視窗系統(tǒng)上運(yùn)行的各種應(yīng)用程序的注冊(cè)信息等。這就意味著,如果注冊(cè)表因?yàn)槟承┰蚴艿搅似茐,輕者是視窗系統(tǒng)啟動(dòng)過程出現(xiàn)異常,重者就有可能導(dǎo)致整個(gè)系統(tǒng)的完全癱瘓。所以正確的認(rèn)識(shí)注冊(cè)表,及時(shí)的備份注冊(cè)表,對(duì)于視窗用戶就顯得相當(dāng)重要。
Vsiaul C#就可以十分方便、簡(jiǎn)潔的開發(fā)出操作注冊(cè)表的程序。本文就是介紹如何利用VisualC#來讀取注冊(cè)表中的信息。
一.初步認(rèn)識(shí)注冊(cè)表:
單擊"開始/運(yùn)行",在"打開"的后面填入"regedit"。就可以看到注冊(cè)表的數(shù)據(jù)結(jié)構(gòu)了。如下圖。注:Regedit文件是微軟公司提供給用戶編輯注冊(cè)表的一個(gè)工具。
點(diǎn)擊小圖放大,圖01:注冊(cè)表結(jié)構(gòu)圖示
如上圖左邊的部分在注冊(cè)表中稱為"主鍵",據(jù)圖可見,"主鍵"是有層次結(jié)構(gòu)的。主鍵的下一級(jí)主鍵稱為該主鍵的"子鍵"。每一個(gè)主鍵可以對(duì)擁有多個(gè)子鍵。如圖所示,右邊的這些值就是所謂的鍵值了。每一個(gè)主鍵或者子鍵都可以擁有多個(gè)鍵值。注冊(cè)表是一個(gè)龐大的數(shù)據(jù)庫,在其中每一個(gè)主鍵,每一個(gè)鍵值都賦予了不同的功能。
二.Visual C#如何讀取注冊(cè)表中的主鍵和鍵值:
在.Net FrameWork SDK Beta 2版中,有一個(gè)Microsoft.Win32的名稱空間,在此名稱空間中提供了二個(gè)用于注冊(cè)表操作的類:Registry類、RegistryKey類。這二個(gè)類都是封閉類,不可以繼承。在這二個(gè)類,定義了許多關(guān)于注冊(cè)表的方法和屬性,通過調(diào)用這二個(gè)類,在Visual C#中就可以比較輕松的處理關(guān)于注冊(cè)表的各種操作了。
(1).Registry類:
此類主要封裝了七個(gè)公有的靜態(tài)域,而這些靜態(tài)域分別代表這視窗注冊(cè)表中的七個(gè)基本的主鍵,具體如下所示:
Registry.ClassesRoot 對(duì)應(yīng)于HKEY_CLASSES_ROOT主鍵
Registry.CurrentUser 對(duì)應(yīng)于HKEY_CURRENT_USER主鍵
Registry.LocalMachine 對(duì)應(yīng)于 HKEY_LOCAL_MACHINE主鍵
Registry.User 對(duì)應(yīng)于 HKEY_USER主鍵
Registry.CurrentConfig 對(duì)應(yīng)于HEKY_CURRENT_CONFIG主鍵
Registry.DynDa 對(duì)應(yīng)于HKEY_DYN_DATA主鍵
Registry.PerformanceData 對(duì)應(yīng)于HKEY_PERFORMANCE_DATA主鍵
(2).RegistryKey類:
此類中主要封裝了對(duì)視窗系統(tǒng)注冊(cè)表的基本操作。在程序設(shè)計(jì)中,首先通過Registry類找到注冊(cè)表中的基本主鍵,然后通過RegistryKey類,來找其下面的子鍵和處理具體的操作的。
三.通過一個(gè)讀取注冊(cè)表信息例子來具體說明這二個(gè)來的用法:
(1).程序設(shè)計(jì)和運(yùn)行的環(huán)境:
I視窗系統(tǒng)2000服務(wù)器版
II Net FrameWork SDK Beta 2版
(2)在運(yùn)行程序前的一些必要的處理工作:
在程序設(shè)計(jì)時(shí),主要功能是讀取已經(jīng)存在的主鍵鍵值,用戶可以按照下圖所示的結(jié)構(gòu)新建若干個(gè)主鍵和對(duì)應(yīng)的鍵值:
點(diǎn)擊小圖放大,圖02:程序設(shè)計(jì)中要讀取的注冊(cè)表的信息
這里有必要說明的是上圖只顯示了"新項(xiàng) #3"子鍵對(duì)應(yīng)的鍵值。在"新項(xiàng) #2"子鍵也有鍵值,對(duì)應(yīng)的鍵值是:"新值#1"為"001","新值 #2"為"002"。在"新項(xiàng) #1"子鍵中對(duì)應(yīng)的鍵值是:"新值 #1"為"aaa","新值 #2"為"bbb"。
(3).程序的主要功能:
程序的主要功能是讀取指定主鍵下面的所有子鍵和子鍵擁有的鍵值,并以列表的形式按層次顯示出來,下圖是本程序運(yùn)行后界面:
點(diǎn)擊小圖放大,圖03:讀取注冊(cè)表信息并以列表形式顯示出來
(4).程序設(shè)計(jì)過程中的重要步驟以及應(yīng)該注意的一些問題:
I 程序中讀取主鍵、子鍵和鍵值所使用到的方法:
程序中為了讀取指定主鍵下面的子鍵和子鍵中擁有的鍵值,主要使用了RegistryKey類中的四個(gè)方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具體的用法和意思如下:
OpenSubKey ( string name )方法主要是打開指定的子鍵。
GetSubKeyNames ( )方法是獲得主鍵下面的所有子鍵的名稱,它的返回值是一個(gè)字符串?dāng)?shù)組。
GetValueNames ( )方法是獲得當(dāng)前子鍵中的所有的鍵名稱,它的返回值也是一個(gè)字符串?dāng)?shù)組。
GetValue ( string name )方法是指定鍵的鍵值。
程序中具體的使用語句如下:
RegistryKey hklm = Registry.LocalMachine ;
//打開"SYSTEM"子鍵
RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ;
//打開"001"子鍵
RegistryKey no1 = software.OpenSubKey ( "001" ) ;
//打開"002"子鍵
RegistryKey no2 = no1.OpenSubKey ( "002" ) ;
其中l(wèi)istBox1是程序中定義了的列表名稱。
II 如何用列表形式顯示注冊(cè)信息:
由于GetSubKeyNames ( )方法和GetValueNames ( )方法的返回值是字符串?dāng)?shù)組,所以在程序中是通過foreach語句實(shí)現(xiàn)遍歷這些字符串?dāng)?shù)組的。并且在遍歷的時(shí)候,就通過列表形式顯示出來,程序中具體實(shí)現(xiàn)語句如下:
foreach ( string site in no2.GetSubKeyNames ( ) )
//開始遍歷由子鍵名稱組成的字符串?dāng)?shù)組
{
listBox1.Items.Add ( site ) ;
//在列表中加入子鍵名稱
RegistryKey sitekey = no2.OpenSubKey ( site ) ;
//打開此子鍵
foreach ( string sValName in sitekey.GetValueNames ( ) )
//開始遍歷由指定子鍵擁有的鍵值名稱組成的字符串?dāng)?shù)組
{
listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ;
//在列表中加入鍵名稱和對(duì)應(yīng)的鍵值
}
}
(5).源程序代碼:
通過以上的論述,我們可以得到程序的源程序代碼,具體如下:
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using Microsoft.Win32 ; public class Form1 : Form
{
private System.ComponentModel.Container components ;
private ListBox listBox1 ;
private Button button1 ;
public Form1 ( )
{
InitializeComponent ( ) ;
}
//清除在程序中使用過的資源
public override void Dispose ( )
{
base.Dispose ( ) ;
components.Dispose ( ) ;
}
//初始化程序中使用到的組件
private void InitializeComponent ( )
{
this.components = new System.ComponentModel.Container ( ) ;
this.button1 = new Button ( ) ;
this.listBox1 = new ListBox ( ) ;
button1.Location = new System.Drawing.Point ( 16 , 320 ) ;
button1.Size = new System.Drawing.Size ( 75 , 23 ) ;
button1.TabIndex = 0 ;
button1.Text = "讀取注冊(cè)表" ;
button1.Click += new System.EventHandler( this.button1_Click ) ;
listBox1.Location = new System.Drawing.Point ( 16 , 32 ) ;
listBox1.Size = new System.Drawing.Size ( 496 , 264 ) ;
listBox1.TabIndex = 1 ;
this.Text = "讀取主測(cè)表信息" ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
this.ClientSize = new System.Drawing.Size ( 528 , 357 ) ;
this.Controls.Add( this.listBox1 ) ;
this.Controls.Add ( this.button1 ) ;
}
protected void button1_Click ( object sender , System.EventArgs e )
{
listBox1.Items.Clear ( ) ;
RegistryKey hklm = Registry.LocalMachine ;
RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ;
//打開"SYSTEM"子鍵
RegistryKey no1 = software.OpenSubKey ( "001" ) ;
//打開"001"子鍵
RegistryKey no2 = no1.OpenSubKey ( "002" ) ;
//打開"002"子鍵
foreach ( string site in no2.GetSubKeyNames ( ) )
//開始遍歷由子鍵名稱組成的字符串?dāng)?shù)組
{
listBox1.Items.Add ( site ) ;
//在列表中加入子鍵名稱
RegistryKey sitekey = no2.OpenSubKey ( site ) ;
//打開此子鍵
foreach ( string sValName in sitekey.GetValueNames ( ) )
//開始遍歷由指定子鍵擁有的鍵值名稱組成的字符串?dāng)?shù)組
{
listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ;
//在列表中加入鍵名稱和對(duì)應(yīng)的鍵值
}
}
}
public static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
}
四.總結(jié):
用Visual C#來讀取注冊(cè)表中的注冊(cè)信息是通過名稱空間Micorsoft.Win32中的二個(gè)類來實(shí)現(xiàn)的。在這二個(gè)類中還定義了對(duì)注冊(cè)表信息的刪除、修改和重命名的一些方法。這些方法比起本文介紹的讀取方法、打開方法來說,更具有破壞性,但也更實(shí)用。對(duì)應(yīng)這些方法的介紹將在以后的文章中進(jìn)行。
通過以上的介紹,我們發(fā)現(xiàn)用Visual C#來處理注冊(cè)表,其實(shí)是一件比較輕松而簡(jiǎn)單的事情。事情雖然是輕松的,但我也要提醒各位,由于注冊(cè)表在視窗系統(tǒng)中的重要作用,所以在每一次對(duì)注冊(cè)表進(jìn)行操作之前,一定要備份,在操作的時(shí)候也要非常小心,因?yàn)槟愕拿恳淮蔚恼`操作都可能導(dǎo)致你的系統(tǒng)崩潰。