c#使用Microsoft.Win32的Registry 和RegistryKey類操作注冊表
要訪問注冊表,可以使用Microsoft.Win32命名空間中的兩個類Registry 和RegistryKey。RegistryKey實例表示一個注冊表項,這個類的方法可以瀏覽子鍵、創建新鍵、讀取或修改鍵中的值。換言之,該類可以完成對注冊表項進行的所有操作(除了設置鍵的安全級別之外)。RegistryKey類可以用于完成對注冊表的所有操作。Registry是不能實例化的一個類。它的作用只是提供表示頂級鍵的RegistryKey實例(不同的巢),以便開始在注冊表中瀏覽。Registry是通過靜態屬性來提供這些實例的,這些屬性共有7個,分別是ClassesRoot、CurrentConfig、CurrentUser、DynData、LocalMachine、PerformanceData和 Users。用戶可以很快猜出它們分別與哪個巢相對應。
例如,要獲得一個表示HKLM鍵的RegistryKey實例,可以編寫下面的代碼:
RegistryKey hklm = Registry.LocalMachine;
獲得RegistryKey對象引用的過程,視為打開一個鍵。
用戶可能會認為,因為注冊表的層次結構類似于文件系統,所以RegistryKey的方法類似于DirectoryInfo的方法,但實際上并非如此。訪問注冊表的方式通常不同于使用文件和文件夾的方式,RegistryKey執行的方法可以反映這種不同。
最明顯的區別是如何在注冊表的給定位置上打開一個注冊表項。Registry類沒有用戶可以使用的公共構造函數,也沒有任何可以直接通過鍵的名稱來訪問鍵的方法。但可以在相關的巢中從上至下瀏覽該鍵。如果要實例化一個RegistryKey對象,惟一的方式是從Registry的靜態屬性開始,向下瀏覽。例如,要讀取HKLM/Software/Microsoft鍵中的一些數據,可以使用下面的代碼獲得它的一個引用:
RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");
以這種方式訪問注冊表項是只讀訪問。如果要寫入該鍵(包括寫入其值,或創建和刪除其子鍵),就需要使用OpenSubKey的另一個重寫方法,該方法的第二個參數是bool類型,表示是否要對該鍵進行讀寫訪問。例如,如果要修改Microsoft鍵(并假定用戶是一個系統管理員,有修改該鍵的許可),就應編寫如下代碼:
RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);
因為這個鍵包含Microsoft應用程序使用的信息,在大多數情況下,就不應修改這個特定鍵。
如果這個鍵已經存在,就應調用OpenSubKey()方法。如果這個鍵不存在,就返回一個空引用。如果要創建一個鍵,就應使用CreateSubKey()方法(該方法會通過返回的引用,自動提供該鍵的讀寫訪問):
RegistryKey hklm = Registry.LocalMachine; RegistryKey hkSoftware = hklm.OpenSubKey("Software"); RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");
CreateSubKey()
工作的方式非常有趣:如果鍵不存在,它就創建這個鍵。但如果鍵已經存在,它就會返回一個表示該鍵的RegistryKey
實例。這個方法采用這樣的工作方式,其原因是用戶總是可以使用這個鍵。注冊表包含長期數據,例如Windows和各種應用程序的配置信息。因此用戶并不需要經常顯式地創建鍵。
更常見的是,應用程序需要確保某些數據在注冊表中是存在的。換言之,如果這些數據不存在,就要創建相關的鍵,但如果它們存在,就不需要做任何事。CreateSubKey()
就可以完成這項任務。與FileInfo.Open()
的情況不同,CreateSubKey()
不會刪除任何數據。如果要刪除注冊表項,就需要顯式調用RegistryKey.Delete()
方法,因此注冊表對于Windows是非常重要的。如果刪除了一些重要的鍵,就會中斷Windows的執行,此時就需要調試C#注冊表調用了。
定位了要讀取或修改的注冊表項后,就可以使用SetValue() 或 GetValue()方法設置或獲取該鍵中的值。這兩個方法的參數都是一個字符串,其中字符串給出了值的名稱,SetValue()還需要一個包含值的信息的對象引用。這個參數定義為對象引用,實際上可以是任何一個類的引用。SetValue()根據所提供的類的類型,確定把值設置為REG_SZ、REG_DWORD,還是 REG_BINARY。例如:
RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware"); hkMine.SetValue("MyStringValue", "Hello World"); hkMine.SetValue("MyIntValue", 20);
這段代碼設置鍵包含兩個值:MyStringValue的類型是REG_SZ,而MyIntValue的類型是REG_DWORD,這里只考慮這兩種類型,在后面的示例中會使用它們。
RegistryKey.GetValue()
的工作方式也是這樣。它返回一個對象引用,如果該方法檢測到值的類型為REG_SZ,就返回一個字符串引用,如果值的類型為REG_DWORD,就返回一個int型值。
string stringValue = (string)hkMine.GetValue("MyStringValue"); int intValue = (int)hkMine.GetValue("MyIntValue"); 最后,完成了讀取或修改數據后,應關閉該鍵: ```csharp hkMine.Close();