1.1 使用注册表
在.NET Compact Framework中,Microsoft.Win32命名空间只提供处理操作系统注册表的类和对象。表18-3列出了Microsoft.Win32命名空间支持的类和对象。
表18-3:Microsoft.Win32命名空间支持的类和对象
类名 | 说明 |
Registry | 提供表示Windows注册表中的根项的RegistryKey对象,并提供访问项/值对的static方法。 |
RegistryKey | 表示Windows注册表中的项级节点。此类是注册表封装。 |
RegistryKeyPermissionCheck | 指定在打开注册表项并访问它们的名称/值对时是否执行安全检查。支持的成员如下。 |
RegistryValueKind | 指定在注册表中存储值时所用的数据类型,或标识注册表中某个值的数据类型。支持的成员如下。 |
Registry类包含在运行Windows Mobile的Pocket PC智能设备上的注册表中能找到的标准子树集。由Registry类公开的RegistryKey实例描绘注册表中的子树项和值的基本存储机制。所有的项都是只读的,因为注册表依赖于它们的存在。由Registry类以静态成员的方式公开的子树有:
l CurrentUser:存储有关用户首选项的信息。
l LocalMachine:存储本地计算机的配置信息。
l ClassesRoot:存储有关类型(和类)及其属性的信息。
l Users:存储有关默认用户配置的信息。
一旦标识了希望在其下存储/检索注册表信息的子树后,就可以开始使用RegistryKey类创建或删除子项和给指定项赋值。
1.1.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() …… |
1.1.2 读取注册表子项
读取注册表子项的功能指检索根项或指定子项的子项。RegistryKey类的GetSubKeyNames方法能够非常方便地检索根项或指定子项的子项。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() …… |
1.1.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子项的三个名称/值对。
…… ' 在 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 子项的三个名称/值对 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() …… |
1.1.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() …… |