註冊表是視窗系統的一個核心的資料庫,在這個資料庫中存放中與系統相關的各種參數,這些參數直接控制中系統的啟動、硬體的驅動程式安裝資訊以及在視窗系統 上啟動並執行各種應用程式的註冊資訊等。這就意味著,如果註冊表因為某些原因受到了破壞,輕者是視窗系統啟動過程出現異常,重者就有可能導致整個系統的完全癱 瘓。所以正確的認識註冊表,及時的備份註冊表,對於視窗使用者就顯得相當重要。
C#就可以十分方便、簡潔的開發出操作註冊表的程式。單擊"開始
/運行",在"開啟"的後面填入"regedit"。就可以看到註冊表的資料結構了。"主鍵"是有階層的。主鍵的下一級主鍵稱為該主鍵的"子鍵"。每
一個主鍵可以對擁有多個子鍵。右邊的這些值就是所謂的索引值了。每一個主鍵或者子鍵都可以擁有多個索引值。註冊表是一個龐大的資料庫,在其中每一個主鍵,每一
個索引值都賦予了不同的功能。
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類,來找其下面的子鍵和處理具體的操作的。
下面通過一個讀取註冊表資訊例子來具體說明這二個來的用法。
程式設計和啟動並執行環境:Windows 2000伺服器版,.Net FrameWork SDK Beta 2版。
在運行程式前的一些必要的處理工作。在程式設計時,主要功能是讀取已經存在的主鍵索引值,使用者可以建立若干個主鍵和對應的索引值。
程式的主要功能是讀取指定主鍵下面的所有子鍵和子鍵擁有的索引值,並以列表的形式按層次顯示出來。程式設計過程中的重要步驟以及應該注意的一些問題:
程
序中讀取主鍵、子鍵和索引值所使用到的方法:
程式中為了讀取指定主鍵下面的子鍵和子鍵中擁有的索引值,主要使用了RegistryKey類中的四個方
法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具體的用法和意思如下:
OpenSubKey ( string name )方法主要是開啟指定的子鍵。
GetSubKeyNames ( )方法是獲得主鍵下面的所有子鍵的名稱,它的傳回值是一個字串數組。
GetValueNames ( )方法是獲得當前子鍵中的所有的鍵名稱,它的傳回值也是一個字串數組。
以下從‘讀’‘寫’‘刪除’‘判斷’四個案例實現對註冊表的簡單操作
1.讀取指定名稱的註冊表的值
private string GetRegistData(string name)
{
string registData;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
registData = aimdir.GetValue(name).ToString();
return registData;
}
以上是讀取的註冊表中HKEY_LOCAL_MACHINE\SOFTWARE目錄下的XXX目錄中名稱為name的註冊表值;
2.向註冊表中寫資料
private void WTRegedit(string name,string tovalue)
{
RegistryKey hklm = Registry.LocalMachine;
RegistryKey software = hklm.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.CreateSubKey("XXX");
aimdir.SetValue(name,tovalue);
}
以上是在註冊表中HKEY_LOCAL_MACHINE\SOFTWARE目錄下建立XXX目錄並在此目錄下建立名稱為name值為tovalue的登錄機碼;
3.刪除註冊表中指定的登錄機碼
private void DeleteRegist(string name)
{
string[] aimnames;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
aimnames = aimdir.GetSubKeyNames();
foreach(string aimKey in aimnames)
{
if(aimKey == name)
aimdir.DeleteSubKeyTree(name);
}
}
以上是在註冊表中HKEY_LOCAL_MACHINE\SOFTWARE目錄下XXX目錄中刪除名稱為name登錄機碼;
4.判斷指定登錄機碼是否存在
private bool IsRegeditExit(string name)
{
bool _exit = false;
string[] subkeyNames;
RegistryKey hkml = Registry.LocalMachine;
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
RegistryKey aimdir = software.OpenSubKey("XXX",true);
subkeyNames = aimdir.GetSubKeyNames();
foreach(string keyName in subkeyNames)
{
if(keyName == name)
{
_exit = true;
return _exit;
}
}
return _exit;
}
以上是在註冊表中HKEY_LOCAL_MACHINE\SOFTWARE目錄下XXX目錄中判斷名稱為name登錄機碼是否存在,這一方法在刪除註冊表時已經存在,在建立一登錄機碼時也應有相應判斷。