RegistryKey類

RegistryKey類在.NET的哪個命名空間中Microsoft.Win32

 

註冊表項是註冊表中的基本組織單位,好比是Windows資源管理器中的文件夾。每個具體的註冊表項都可以有子項,就像文件夾下可以有子文件夾一樣。只要用戶具有相應的權限,且註冊表項不是基項或基項的下一級項,就可以刪除該註冊表項。每個註冊表項也可帶有與其相關聯的多個值(一個值就好比是一個文件),它們用於存儲信息,例如,有關計算機上安裝的應用程序的信息。每個值存儲特定的信息,可按需要對其進行檢索或更新。例如,可以爲您的公司創建一個RegistryKey(在項HKEY_LOCAL_MACHINE\Software下),然後爲您的公司創建的每個應用程序創建一個子項。每個子項保存特定於該應用程序的信息,如顏色設置、屏幕位置和大小或者可識別的文件擴展名。

 

 HKEY_CLASSES_ROOT該主鍵包含了文件的擴展名和應用程序的關聯信息以及Window Shell和OLE用於儲存註冊表的信息。該主鍵下的子鍵決定了在WINDOWS中如何顯示該類文件以及他們的圖標,該主鍵是從HKEY_LCCAL_MACHINE\SOFTWARE\Classes映射過來的。
  HKEY_CURRENT_USER該主鍵包含了如用戶窗口信息,桌面設置等當前用戶的信息。
  HKEY_LOCAL_MACHINE主鍵包含了計算機軟件和硬件的安裝和配置信息,該信息可供所有用戶使用
  HKEY_USERS該主鍵記錄了當前用戶的設置信息,每次用戶登入系統時,就會在該主鍵下生成一個與用戶登入名一樣的子鍵,該子鍵保存了當前用戶的桌面設置、背景位圖、快捷鍵,字體等信息。一般應用程序不直接訪問改主鍵,而是通過主鍵HKEY_CURRENT_USER進行訪問。
  HKEY_CURRENT_CONFIG該主鍵保存了計算機當前硬件的配置信息,這些配置可以根據當前所連接的網絡類型或硬件驅動軟件安裝的改變而改變。
  C#也支持對註冊表的編輯,.NET框架在Microsoft.Win32名字空間中提供了兩個類來操作註冊表:Registry和RegistryKey。這兩個類都是密封類不允許被繼承。下面我們分別來介紹這兩個類。
  Registry類提供了7個公共的靜態域,分別代表7個基本主鍵(其中兩個在XP系統中沒有,在這就不介紹了)分別是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig。它們分別對應哪幾個鍵我想各位一看就會知道吧。

RegistryKey類中提供了對註冊表操作的方法要注意的是操作註冊表必須符合系統權限,否則將會拋出錯誤。
 下面我們就來幾個操作註冊表常用的幾個方法
 創建子鍵的方法原型爲:

public RegistryKey CreateSubKey(string sunbkey);

 參數sunbkey表示要創建的子鍵的名稱或路徑名。創建成功返回被創建的子鍵,否則返回null。
  打開子鍵的方法原型爲:

 public RegistryKey OpenSubKey(string name);
  public RegistryKey OpenSubKey(string name,bool writable);

參數name表示要打開的子鍵名或其路徑名,參數writable表示被打開的子鍵是否允許被修改,第一個方法打開的子鍵是隻讀的。Microsoft.Win32類還爲我們提供了另一個方法,用於打開遠程計算機上的註冊表,方法原型爲:

 public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey,string machineName);

刪除子鍵的方法原型爲

  public void DeleteKey(string subkey);

該方法用於刪除指定的主鍵。如果要刪除的子鍵還包含主鍵則刪除失敗,並返回一個異常,如果要徹底刪除該子鍵極其目錄下的子鍵可以用方法DeleteSubKeyTree,該方法原型如下:

  public void DeleteKeyTree(string subkey);

讀取鍵值的方法原型如下:

 public object GetValue(string name);
   public object GetValue(string name,object defaultValue);

  參數name表示鍵的名稱,返回類型是一個object類型,如果指定的鍵不存在則返回null。如果失敗又不希望返回的值是null則可以指定參數defaultValue,指定了參數則在讀取失敗的情況下返回該參數指定的值。
   設置鍵值的方法原型如下:

 public object SetValue(string name,object value);


  

 

程序中讀取主鍵、子鍵和鍵值所使用到的方法:


程序中爲了讀取指定主鍵下面的子鍵和子鍵中擁有的鍵值,主要使用了RegistryKey類中的四個方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具體的用法和意思如下:
OpenSubKey ( string name )方法主要是打開指定的子鍵。

GetSubKeyNames ( )方法是獲得主鍵下面的所有子鍵的名稱,它的返回值是一個字符串數組。

GetValueNames ( )方法是獲得
當前子鍵中的所有的鍵名稱,它的返回值也是一個字符串數組。
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" ) ;
其中listBox1是程序中定義了的列表名稱。

II如何用列表形式顯示註冊信息:
由於GetSubKeyNames ( )方法和GetValueNames ( )方法的返回值是字符串數組,所以在程序中是通過foreach語句實現遍歷這些字符串數組的。並且在遍歷的時候,就通過列表形式顯示出來,程序中具體實現語句如下:
foreach ( string site in no2.GetSubKeyNames ( ) )
//開始遍歷由子鍵名稱組成的字符串數組

{
listBox1.Items.Add ( site ) ;
//在列表中加入子鍵名稱

RegistryKey sitekey = no2.OpenSubKey ( site ) ;
//打開此子鍵

foreach ( string sValName in sitekey.GetValueNames ( ) )
//開始遍歷由指定子鍵擁有的鍵值名稱組成的字符串數組

{
listBox1.Items.Add ( "" + sValName + ": " + sitekey.GetValue ( sValName ) ) ;
//在列表中加入鍵名稱和對應的鍵值

}
}

RegistryKey類中有一個OpenSubKey()方法,可以用於打開子鍵,要注意它是有重載的,共有兩種方法,分別爲OpenSubKey(string name)OpenSubKey(string name,bool writable)。如果使用第一種方法打開子鍵,將只能讀而不能寫,這等同於第二種方法中將writable置爲false。只有使用第二種方法並將writable置爲true纔可以對子鍵進行些操作。否則會引發UnauthorizedException

 

 

以下從‘讀’‘寫’‘刪除’‘判斷’四個事例實現對註冊表的簡單操作
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註冊表項是否存在,這一方法在刪除註冊表時已經存在,在新建一註冊表項時也應有相應判斷

 

 

 

 

自己寫的代碼關鍵是思路要清晰

RegistryKeyself=Registry.LocalMachine .OpenSubKey ("software",true).CreateSubKey ("self");

RegistryKeyself1=self .CreateSubKey("self1");

self1.SetValue("name1","changlina");

self1.SetValue("name2","changlili");

self1.SetValue("name3","dufan");

 

RegistryKeyself2 = self.CreateSubKey("self2");

self2.SetValue("name1","gejing");

self2.SetValue("name2","huoting");

self2.SetValue("name3","guilin");

//setvalue的第二個參數是object類型的,string,int等類型都是從object類型繼承來的,所以都能用。key2.SetValue("1", 12);這個是爲了測試當第二個參數是int型時候結果是怎麼樣的,這裏結果是12

 

RegistryKeyself3 = self.CreateSubKey("self3");

self3.SetValue("name1","liuyingying");

self3.SetValue("name2","liangsijia");

self3.SetValue("name3","limin");

//上述在software下定義了一個子鍵self,在self下面又定義了三個子鍵soft1,soft2,soft3,關鍵在於理解這四個都是registrykey類型的,但是在self1,self2,self3下賦值並不是registrykey的類型,所以是直接調用的函數的;

 

foreach(stringaainself.GetSubKeyNames())

{

Response.Write("self下的子鍵名字是"+aa+"<br>");

foreach(stringssinself.OpenSubKey(aa).GetValueNames())//getvaluename是取值的名字的函數

{

Response.Write("子鍵中鍵值的名字是:"+ ss +"子鍵中鍵值的值是"+ self.OpenSubKey (aa).GetValue(ss) +"<br>");

}

}

 

 刪除註冊表時候用到的函數DeleteSubKeyTree DeleteSubKey DeleteValue

deletesubkey這個函數的時候會把子鍵下的所有的鍵值一起都刪了

DeleteValue是把鍵值的名字和值一起給刪除了,並不是只刪除了值

 

protectedvoidButton2_Click(objectsender,EventArgse)

{

RegistryKeydel =Registry.LocalMachine.OpenSubKey("software",true);

del.OpenSubKey("self",true).DeleteSubKeyTree ("self1");

Response .Write ("一次性刪除self1下的所有了<br>");

//del.OpenSubKey("self", true).OpenSubKey("self2", true).DeleteSubKey("name1");

//Response.Write("刪除了self2的subkey name1<br>");這兩行是錯誤的 應爲name1不是子鍵了,所以不能用delsubkey來操作了

del.OpenSubKey("self",true).OpenSubKey("self2",true).DeleteValue("name2");//其實是把name2名字和值一起給刪除了,並不是只刪除了值

Response.Write("刪除了self2的子鍵name2的值<br>");

Response.Write("查看註冊表,應該在software下還剩下self下的self2的沒有name2,name1和name3和self3下的所有的值<br>");

del.OpenSubKey("self",true).DeleteSubKey("self2");//self2下有三個鍵值,看看用刪除子鍵的函數是不是把鍵值一起刪除了;

Response.Write("查看self2下面是不是把所有的鍵值都刪了,用的是deletesubkey看是不是把子鍵下所有的鍵值一起都刪了?");

//結果是當用deletesubkey這個函數的時候會把子鍵下的所有的鍵值一起都刪了

del.OpenSubKey("self",true).DeleteSubKey("self3");

}

轉自:http://blog.chinaitlab.com/html/33/1472933-162432.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章