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