C#操作注册表
using Microsoft.Win32 ;
以下從‘讀’‘寫’‘刪除’‘判斷’四個事例實現對注冊表的簡單操作
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注冊表項是否存在,這一方法在刪除注冊表時已經存在,在新建一注冊表項時也應有相應判斷;
------------------------------------------------------------------------------------------------------------
18.3? 使用注冊表
在.NET Compact Framework中,Microsoft.Win32命名空間只提供處理操作系統注冊表的類和對象。表18-3列出了Microsoft.Win32命名空間支持的類和對象。
表18-3? Microsoft.Win32命名空間支持的類和對象
| 類名 | 說明 |
| Registry | 提供表示Windows注冊表中的根項的RegistryKey對象,并提供訪問項/值對的static方法 |
| RegistryKey | 表示Windows注冊表中的項級節點。此類是注冊表封裝 |
| RegistryKeyPermissionCheck | 指定在打開注冊表項并訪問它們的名稱/值對時是否執行安全檢查 |
| RegistryValueKind | 指定在注冊表中存儲值時所用的數據類型,或標識注冊表中某個值的數據類型 |
Registry類包含在Windows Mobile的注冊表中能找到的標準子樹集。由Registry類公開的RegistryKey實例,描繪注冊表中的子樹項和值的基本存儲機制。所有的項都是只讀的,因為注冊表依賴于它們的存在。由Registry類以靜態成員的方式公開的子樹有:
· CurrentUser? 存儲有關用戶首選項的信息。
· LocalMachine?? 存儲本地計算機的配置信息。
· ClassesRoot? 存儲有關類型(和類)及其屬性的信息。
· Users? 存儲有關默認用戶配置的信息。
一旦標識了希望在其下存儲/檢索注冊表信息的子樹后,就可以開始使用RegistryKey類創建或刪除子項和給指定項賦值。
18.3.1? 創建注冊表子項
在.NET Compact Framework中,可以調用RegistryKey類的CreateSubKey方法來實現創建注冊表子項的功能。調用CreateSubKey方法,創建一個新子項或打開一個現有子項以進行寫訪問。.NET Compact Framework只提供了CreateSubKey方法的一種重載版本。該方法的聲明語法如下:
Public Function CreateSubKey (ByVal subkey As String) As RegistryKey
字符串subkey不區分大小寫,指定要創建或打開的子項的名稱或路徑。CreateSubKey方法返回一個標識新建子項的RegistryKey對象。如果操作失敗,則返回空引用(在Visual Basic中為Nothing)。如果為subkey指定了零長度字符串,則返回當前的RegistryKey對象。以下代碼演示調用RegistryKey類的CreateSubKey方法。
……
' 在 HKEY_CURRENT_USER 下創建一個名為 RegistryDemo 的子項
Dim RegistryDemo As Microsoft.Win32.RegistryKey = _
??? Microsoft.Win32.Registry.CurrentUser.CreateSubKey("RegistryDemo")
?
' 在 HKEY_CURRENT_USER\RegistryDemo 下創建兩個子項
RegistryDemo.CreateSubKey("TestName").Close()
Dim TestSettings As Microsoft.Win32.RegistryKey = RegistryDemo.CreateSubKey("TestSettings")
?
' 關閉 RegistryKey 實例
TestSettings.Close()
RegistryDemo.Close()
……
18.3.2? 讀取注冊表子項
讀取注冊表子項的功能指檢索根項或指定子項的子項。RegistryKey類的GetSubKey Names方法能夠非常方便地檢索根項或指定子項的子項。GetSubKeyNames方法的聲明語法如下:
Public Function GetSubKeyNames As String()
GetSubKeyNames方法返回一個包含當前項的子項名稱的字符串數組。以下代碼演示調用RegistryKey類的GetSubKeyNames方法,檢索HKEY_CURRENT_USER的所有子項。
……
Dim subKeyName As String
Dim subkeys As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser
?
' 返回 HKEY_CURRENT_USER 的所有子項
Dim keynames As String() = subkeys.GetSubKeyNames()
?
' 顯示子項名稱
For Each subKeyName In keynames
??? MsgBox(subKeyName)
Next
?
subkeys.Close()
……
18.3.3? 創建注冊表值項
創建注冊表值項的功能是指設置注冊表項中的名稱/值對的值。通過RegistryKey類的SetValue方法和Registry類的SetValue方法,都可以實現創建注冊表值項的功能。但是每次使用Registry類的SetValue方法時,SetValue方法都會嘗試打開和關閉注冊表項,所以當訪問大數據量的值項時,建議使用RegistryKey類的SetValue方法來保證更好的性能。在.NET Compact Framework中,RegistryKey類的SetValue方法提供兩個重載版本,其聲明語法如下:
Public Shared Sub SetValue ( _
??? ByVal keyName As String, _
??? ByVal valueName As String, _
??? ByVal value As Object, _
)
?
Public Shared Sub SetValue ( _
??? ByVal keyName As String, _
??? ByVal valueName As String, _
??? ByVal value As Object, _
??? ByVal valueKind As RegistryValueKind _
)
SetValue方法的通過RegistryValueKind參數指定的注冊表枚舉數據類型,設置該指定的注冊表項的名稱/值對。如果指定的值項不存在,則創建該值項。注冊表值項,可具有與任何名稱都不關聯的值。如果注冊表編輯器中顯示此未命名的值,則會出現字符串“(Default)”,而不會出現值項的名稱。若要設置這個未命名的值,則指定valueName為空引用或空字符串即可。如果指定的value類型與指定的valueKind不匹配,并且無法轉換數據,則會拋出ArgumentException例外。
以下代碼演示調用RegistryKey類的SetValue方法設置TestSettings子項的3個名稱/值對:
……
??? ' 在 HKEY_CURRENT_USER 下創建一個名為 RegistryDemo 的子項
Dim RegistryDemo As Microsoft.Win32.RegistryKey = _
Microsoft.Win32.Registry.CurrentUser.CreateSubKey("RegistryDemo")
?
' 在 HKEY_CURRENT_USER\RegistryDemo 下創建兩個子項
RegistryDemo.CreateSubKey("TestName").Close()
Dim TestSettings As Microsoft.Win32.RegistryKey = RegistryDemo.CreateSubKey("TestSettings")
?
??? ' 設置 TestSettings 子項的3個名稱/值對
??? Dim myStrings() As String = {"One", "Two", "Three"}
TestSettings.SetValue("TestArray", myStrings)
??? TestSettings.SetValue("語言", "英語")
TestSettings.SetValue("級別", "CET-6")
TestSettings.SetValue("ID", 1001)
?
' 關閉 RegistryKey 實例
TestSettings.Close()
RegistryDemo.Close()
……
18.3.4? 讀取注冊表值項
讀取注冊表值項的功能,包括檢索與指定子項關聯的所有值名稱和值項所對應的值兩部分功能。通過RegistryKey類的GetValueNames方法,可以實現檢索與指定子項關聯的所有值名稱的功能。通過RegistryKey類的GetValue方法和Registry類的GetValue方法,都可以實現檢索子項所對應項值的功能。但是每次使用Registry類的GetValue方法時,GetValue方法都會嘗試打開和關閉注冊表項,所以當訪問大數據量的值項時,建議使用RegistryKey類的GetValue方法。RegistryKey類的GetValueNames方法的聲明語法如下:
Public Function GetValueNames As String()
在.NET Compact Framework中,RegistryKey類的GetValue方法提供兩個重載版本,其聲明語法如下:
Public Function GetValue (ByVal name As String) As Object
Public Function GetValue (ByVal name As String, ByVal defaultValue As Object) As Object
GetValueNames方法返回一個包含與此項關聯的所有值名稱的字符串數組。如果未找到此項的值名稱,則返回一個空數組。注冊表子項可以有一個默認值,該默認值的名稱為空字符串("")的名稱/值對。如果為注冊表子項設置了默認值,則GetValueNames方法返回的數組包含該空字符串。
GetValue方法返回一個與指定注冊表項中的指定名稱關聯的值。如果在指定的項中未找到該名稱,則返回用戶提供的默認值;或者如果指定的項不存在,則返回空引用。以下代碼演示調用RegistryKey類的GetValueNames方法,檢索TestSettings子項的所有值項的名稱,并通過GetValue方法顯示值項對應的值。
……
Dim valueName As String
Dim subkeys As Microsoft.Win32.RegistryKey = _
??? Microsoft.Win32.Registry.CurrentUser.OpenSubKey("RegistryDemo\TestSettings")
?
' 返回 TestSettings 的所有值項
Dim keyvalues As String() = subkeys.GetValueNames()
?
' 顯示值項名稱和對應的值
For Each valueName In keyvalues
??? MsgBox("名稱/值對 " & valueName & "=" & subkeys.GetValue(valueName).ToString())
Next
?
subkeys.Close()
……
18.3.5? 刪除注冊表子項
在.NET Compact Framework中,提供了兩種刪除注冊表子項的方法。分別是RegistryKey類的DeleteSubKeyTree和DeleteSubKey方法。DeleteSubKeyTree方法遞歸刪除指定子項以及該子項所包括的任何子項。DeleteSubKey方法刪除指定的子項。在.NET Compact Framework中,DeleteSubKey方法提供兩個重載版本。DeleteSubKeyTree和DeleteSubKey方法的聲明語法如下:
Public Sub DeleteSubKeyTree (ByVal subkey As String)
?
Public Sub DeleteSubKey (ByVal subkey As String)
Public Sub DeleteSubKey (ByVal subkey As String, ByVal throwOnMissingSubKey As Boolean)
RegistryKey類的這兩個方法的字符串參數subkey均不區分大小寫。使用DeleteSubKeyTree方法刪除指定子項時,將刪除目錄樹中該項下的所有項,并且不提供任何警告提示。如果僅希望刪除不包括其他子項的子項時,可以使用DeleteSubKey方法。DeleteSubKey方法的throwOnMissingSubKey參數,指示在找不到指定子項的情況下是否引發異常。如果該參數為true,并且指定的子項不存在,則引發異常;如果該參數為false,并且指定的子項不存在,則不執行任何操作。以下代碼演示調用RegistryKey類的DeleteSubKey和DeleteSubKeyTree方法,分別刪除子項TestSettings和RegistryDemo。
?
……
' 刪除子項 TestSettings 和 RegistryDemo
Microsoft.Win32.Registry.CurrentUser.DeleteSubKey("RegistryDemo\TestName")
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree("RegistryDemo")
……
18.3.6? 刪除注冊表值項
刪除注冊表值項的功能是指從當前子項中刪除指定的值項。通過RegistryKey類的DeleteValue方法,可以實現刪除注冊表值項的功能。在.NET Compact Framework中,RegistryKey類的DeleteValue方法提供兩個重載版本,其聲明語法如下:
Public Sub DeleteValue (ByVal name As String)
Public Sub DeleteValue (ByVal name As String, ByVal throwOnMissingValue As Boolean)
DeleteValue方法通過RegistryValueKind參數指定的注冊表枚舉數據類型,設置該指定的注冊表項的名稱/值對。DeleteValue方法的throwOnMissingSubKey參數,指示在找不到指定值的情況下是否引發異常。如果該參數為True,并且指定的值項不存在,則引發異常;如果該參數為False,并且指定的值項不存在,則不執行任何操作。以下代碼演示調用RegistryKey類的DeleteValue方法刪除值項TestArray。
……
Dim testSettings As Microsoft.Win32.RegistryKey = _
??? Microsoft.Win32.Registry.CurrentUser.OpenSubKey("RegistryDemo\TestSettings")
?
' 刪除值項 TestArray
testSettings.DeleteValue("TestArray")
testSettings.Close()
……
18.3.7? 注冊表數據類型
表18-2列出了.NET Compact Framework 2.0支持的7種常用的Windows Mobile注冊表數據類型。這7種注冊表數據類型的定義,包含在Microsoft.Win32命名空間的枚舉對象RegistryValueKind里。
設置注冊表項的值時,應該使用SetValue方法顯式地指定注冊表數據類型。檢索和顯示注冊表項的值時,應該先使用GetValueKind方法檢查注冊表數據類型。
?
?
?
表18-2? Windows Mobile注冊表數據類型
| 數據類型 | 說明 |
| String | 固定長度的文本字符串。此值與 Win32 API 注冊表數據類型 REG_SZ 等效 |
| Binary | 指定任意格式的二進制數據。此值與 Win32 API 注冊表數據類型 REG_BINARY 等效 |
| DWORD | 數據由4字節長的數表示。設備驅動程序和服務的很多參數都是這種類型,這些參數在注冊表編輯器中是以二進制、十六進制或十進制的格式顯示的。此值與 Win32 API 注冊表數據類型 REG_DWORD 等效 |
| MultiString | 多重字符串。包含列表或多值(其格式可被用戶讀取)的值通常為該類型。各個值項之間可以使用空格、逗號或其他標記分開。此值與 Win32 API 注冊表數據類型 REG_MULTI_SZ 等效 |
| ExpandString | 指定一個以 NULL 結尾的字符串,該字符串中包含對環境變量(如 %PATH%,當值被檢索時,就會展開)的未展開的引用。此值與 Win32 API 注冊表數據類型 REG_EXPAND_SZ 等效 |
| QWord | 指定一個 64 位二進制數。此值與 Win32 API 注冊表數據類型 REG_QWORD 等效 |
| Unknown | 指示一個不受支持的注冊表數據類型。例如,不支持 Microsoft Win32 API 注冊表數據類型 REG_RESOURCE_LIST。使用此值指定 SetValue 方法,應在存儲名稱/值對時確定適當的注冊表數據類型 |
清單18-1演示調用RegistryKey類的SetValue、GetValueKind方法和枚舉對象RegistryValueKind設置及檢查顯示各種類型的注冊表數據。
清單18-1? 設置及檢查顯示各種類型的注冊表數據
……
Dim rk As Microsoft.Win32.RegistryKey = _
??? Microsoft.Win32.Registry.CurrentUser.CreateSubKey("RegistryDemo\RegistryValueKindExample")
?
' 創建名稱/值對
rk.SetValue("QuadWordValue", 42, Microsoft.Win32.RegistryValueKind.QWord)
rk.SetValue("DWordValue", 42, Microsoft.Win32.RegistryValueKind.DWord)
rk.SetValue("MultipleStringValue", New String() {"One", "Two", "Three"}, _
??? Microsoft.Win32.RegistryValueKind.MultiString)
rk.SetValue("BinaryValue", New Byte() {10, 43, 44, 45, 14, 255}, _
??? Microsoft.Win32.RegistryValueKind.Binary)
rk.SetValue("StringValue", "The path is %PATH%", Microsoft.Win32.RegistryValueKind.String)
rk.SetValue("ExpandedStringValue", "The path is %PATH%", _
??? Microsoft.Win32.RegistryValueKind.ExpandString)
?
' 顯示名稱/值對
Dim valueNames As String() = rk.GetValueNames()
Dim s As String
For Each s In valueNames
??? Dim rvk As Microsoft.Win32.RegistryValueKind = rk.GetValueKind(s)
??? Select Case rvk
??????? Case Microsoft.Win32.RegistryValueKind.MultiString
??????????? Dim values As String() = CType(rk.GetValue(s), String())
??????????? MsgBox(s & ":" & rvk & ":" & values(0))
??????????? Dim i As Integer
??????????? For i = 1 To values.Length - 1
??? MsgBox(i & ":" & values(i))
??????????? Next
??????? Case Microsoft.Win32.RegistryValueKind.Binary
??????????? Dim bytes As Byte() = CType(rk.GetValue(s), Byte())
??????????? MsgBox(s & ":" & rvk & ":" & bytes(0))
??????????? Dim i As Integer
??????????? For i = 1 To bytes.Length - 1
??? MsgBox(s & ":" & bytes(i))
??????????? Next
??????? Case Else
??????????? MsgBox(s & ":" & rvk & ":" & rk.GetValue(s))
??????? End Select
??? Next
……
執行清單18-1的代碼,向Pocket PC設備注冊表寫入數據的結果如圖18-3所示。
?
圖18-3? 各種類型的注冊表數據
通過本章的介紹,應該對如何使用Windows Mobile注冊表有了一定的了解。接下來通過介紹一個Pocket PC設備的注冊表應用實例來加深感性認識。
????????????
???????????????????? [Reprinted from http://book.csdn.net/bookfiles/166/1001667314.shtml]
轉載于:https://www.cnblogs.com/GT_Andy/archive/2009/05/16/1922082.html
總結
- 上一篇: 有了嫂子之后,我再也不是妈妈心中重要的那
- 下一篇: JS日期相加