信息发布软件,b2b软件,广告发布软件

标题: vb.net注册表功能您忘了没有来这里最详细的解答您的疑问 [打印本页]

作者: 信息发布软件    时间: 2017-5-11 22:26
标题: vb.net注册表功能您忘了没有来这里最详细的解答您的疑问

vb.net中访问注册表变得非常的简单。我们可以用microsoft.Win32 名称空间的下的registry类和registryKey类。另外My.Computer.Registry 也可以返回一个Microsoft.Win32.Registry类的实例。

  下面就举几个小例子来说明vb.net访问注册表的方法。

  1、返回或创建一个注册表键


  Dim Key1 As Microsoft.Win32.RegistryKey

Key1 = My.Computer.Registry.CurrentUser '返回当前用户键

Dim Key2 As Microsoft.Win32.RegistryKey

Key2 = Key1.OpenSubKey("northsnow") '返回当前用户键下的northsnow键

If Key2 Is Nothing Then

Key2 = Key1.CreateSubKey("northsnow") '如果键不存在就创建它

End If

  2、删除注册表键


  Dim Key1 As Microsoft.Win32.RegistryKey

Key1 = My.Computer.Registry.CurrentUser '返回当前用户键

Dim Key2 As Microsoft.Win32.RegistryKey

Key2 = Key1.OpenSubKey("northsnow") '返回当前用户键下的northsnow键

If Not Key2 Is Nothing Then

Key1.DeleteSubKey("northsnow") '如果键不存在就创建它

End If

  3、创建或读取注册表项


  Dim Key1 As Microsoft.Win32.RegistryKey

Key1 = My.Computer.Registry.CurrentUser '返回当前用户键

Dim Key2 As Microsoft.Win32.RegistryKey

Key2 = Key1.OpenSubKey("northsnow", True) '返回当前用户键下的northsnow键,

  如果想创建项,必须指定第二个参数为true

If Key2 Is Nothing Then

Key2 = Key1.CreateSubKey("northsnow") '如果键不存在就创建它

End If

'创建项,如果不存在就创建,如果存在则覆盖

Key2.SetValue("name", "塞北的雪")

Key2.SetValue("sex", True)

Key2.SetValue("age", 30)

'返回项值

Dim sb As New System.Text.StringBuilder

sb.AppendLine(Key2.GetValue("name"))

sb.AppendLine(Key2.GetValue("sex"))

sb.AppendLine(Key2.GetValue("age"))

MsgBox(sb.ToString)

'查验某个项是否存在

If (Key2.GetValue("name")) Is Nothing Then

MsgBox("no")

Else

MsgBox("yes")

End If

If (Key2.GetValue("name2")) Is Nothing Then

MsgBox("no")

Else

MsgBox("yes")

End If

  '输出

' 塞北的雪

'True

'30

'yes

'no


4、遍历注册表

  这个也非常简单,

  在窗体上放一个按钮和两个文本框,添加如下的代码:


  Dim sb As New System.Text.StringBuilder '返回遍历结果

Dim sb2 As New System.Text.StringBuilder '返回读取出错的注册表键

Private Sub Button3_Click()Sub Button3_Click(ByVal sender As System.Object,

  ByVal e As System.EventArgs) Handles Button3.Click

Dim Key1 As Microsoft.Win32.RegistryKey

Key1 = My.Computer.Registry.CurrentUser '返回当前用户键

If Not Key1 Is Nothing Then

sb.AppendLine(Key1.Name)

readValue(Key1)

readReg(Key1)

End If

Me.TextBox1.Text = sb.ToString

Me.TextBox2.Text = sb2.ToString

End Sub

'遍历注册表键树

Private Sub readReg()Sub readReg(ByVal r As Microsoft.Win32.RegistryKey)

If r.SubKeyCount > 0 Then

Dim keyName() As String

Dim keyTemp As Microsoft.Win32.RegistryKey

keyName = r.GetSubKeyNames

Dim i As Integer

For i = 0 To keyName.GetLength(0) - 1

Try

sb.AppendLine(keyName(i))

keyTemp = r.OpenSubKey(keyName(i), True)

readValue(keyTemp)

readReg(keyTemp)

Catch ex As Exception

sb2.AppendLine(keyName(i))

End Try

Next

End If

End Sub

'遍历某键下的项

Private Sub readValue()Sub readValue(ByVal r As Microsoft.Win32.RegistryKey)

If r.ValueCount > 0 Then

Dim valueName() As String

Dim i As Integer

valueName = r.GetValueNames

For i = 0 To valueName.GetLength(0) - 1

sb.AppendLine("####")

sb.Append(r.Name)

sb.Append("----")

sb.Append(r.GetValue(valueName(i)).ToString)

Next

End If

End Sub




一、基本概念

1.项(Key):是对象(Object),称为 Microsoft.Win32.RegistryKey 对象
2.项名(KeyName):一定是字符串,例如"HKEY_CURRENT_USER\Soft1\Stone"
3.值(Value):各种类型,例如("String Line2", 22, &HFF, New String() {"String Line1", "String Line2", "String Line3"}, New Byte() {255, 0})
4.值名(ValueName):一定是字符串,例如("Hate1", "Hate2", "Hate3")
5.键值类型
 1)字符串值(REG_SZ):对应.Net类型System.String
    2)二进制值(REG_BINARY):对应.Net类型System.Byte(),字节数组
    3)DWORD值(REG_DWORD):32位的,对应.Net类型System.Int32或VB类型Integer
    4)QWORD值(REG_QWORD):64位的,对应.Net类型System.Int64或VB类型Long
    5)多字符串值(REG_MULTI_SZ):对应.Net类型System.String(),字符串数组
    6)可扩充字符串值(REG_EXPAND_SZ):对应.Net类型System.String
6.安全性和注册表权限
 1)在注册表中以纯文本形式存储机密信息(例如密码)是不安全的,即使注册表项受 ACL(访问控制列表)保护。
    2)任何以完全信任方式运行的代码(在默认安全策略下,指任何安装在用户的本地硬盘上的代码)都具有访问注册表的必要权限。
    3)注册表变量不应存储在没有 RegistryPermission 的代码也能访问的内存位置。同样,在授予权限时,应授予完成任务所需的最小权限。
    4)更多信息请参阅代码访问安全性。

二、常见操作的实现方法

1.读取注册表项的键值
   [要点]

  My.Computer.Registry 对象中的 GetValue 方法以及Microsoft.Win32.RegistryKey 对象的 GetValue 方法可用于读取 Windows 注册表中的值。
    如果项不存在,则引发异常。
  如果 ValueName不存在,则返回 Nothing,当然可以设置当值不存在的返回默认值。


   [方法一]
    My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\360Safe", "ScanDate", String.Empty)

    注:此方法中如果基项名称不存在,则引发异常(如:HKEY_CURRENT_USER就是有效的基项名称),非基项名称不存在不会引发异常,只会返回DefaultValue,本例为String.Empty
   [方法二]
    My.Computer.Registry.CurrentUser.OpenSubKey("Software\360Safe").GetValue("ScanDate", String.Empty)
   注:方法OpenSubKey的项名(本例中为"Software\360Safe")必须存在,否则会引发异常
   [特别主意]
    1) 读取注册表项的默认键值,请将ValueName置为String.Empty;

  2.创建注册表项以及创建项下的键值
 [要点]
    Microsoft.Win32.RegistryKey 对象的 CreateSubKey 方法可用于创建注册表项。如果项已经存在,也不会引发异常。
   My.Computer.Registry 对象的 SetValue 方法可用于写入 Windows 注册表的值。如果注册表值不存在,将创建注册表值,包括完整的注册表项路径。
   [创建项]
   My.Computer.Registry.CurrentUser.CreateSubKey("Key1\Key2\...\Keyn")
    My.Computer.Registry.LocalMachine.CreateSubKey("Key1\Key2\...\Keyn")
   注:此方法中如果项名称不存在,则创建新项,如果项已存在,不会引发异常
   [创建键值]
    1) 创建二进制键值:
      My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", New Byte() {255, 0},   Microsoft.Win32.RegistryValueKind.Binary)
   或  My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", New Byte() {&HFF, &H0}, Microsoft.Win32.RegistryValueKind.Binary)
    2) 创建字符串键值:
      My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", "Hate You!") 当然后面加上类型也没错,但是没必要,如下->
     My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", "Hate You!", Microsoft.Win32.RegistryValueKind.String)
    3) 创建DWORD(32位数字)键值:下面4种方法都可以,是一样的效果
            My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate1", 32)
            My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate2", 32, Microsoft.Win32.RegistryValueKind.DWord)
            My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", &H20)
           My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate4", &H20, Microsoft.Win32.RegistryValueKind.DWord)
   4) 创建QWORD(64位数字)键值,多字符串键值和可扩充字符串键值的方法同理如下:
      My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate1", New String() {"String Line1", "String Line2", "String Line3"}, Microsoft.Win32.RegistryValueKind.MultiString)
             My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate2", "This is a new String line.", Microsoft.Win32.RegistryValueKind.ExpandString)
             My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", &H20, Microsoft.Win32.RegistryValueKind.QWord)
    [特别主意]
    1) 写入注册表项的默认键值,请将ValueName置为String.Empty;
        2) 二进制键值请使用字节数组,多字符串键值请使用字符串数组。

  3.修改注册表项的键值

     (修改键值同设置键值,也是同样的使用SetValue方法)

4.删除注册表项以及删除注册表项下的键值

 [要点]
   Microsoft.Win32.RegistryKey 对象的 DeleteSubKey 方法可用于删除指定的子项。字符串 SubKey不区分大小写。
    Microsoft.Win32.RegistryKey 对象的 DeleteSubKeyTree 方法可用于递归删除子项和任何子级子项。字符串 subkey 不区分大小写。
    Microsoft.Win32.RegistryKey 对象的 DeleteValue 方法可用于从此项中删除指定值。
    [删除叶子子项]
    My.Computer.Registry.CurrentUser.DeleteSubKey("Key1\Key2\...\Keyn", False)
    注:此方法中如果叶子子项不存在,则根据此方法的第二个参数确定是否引发异常,True引发,False不引发
    [删除主干子项]
    My.Computer.Registry.CurrentUser.DeleteSubKeyTree("Key1\Key2")
    注:你使用此方法删除叶子子项也是可以的
    [删除键值]
    My.Computer.Registry.CurrentUser.OpenSubKey("Stone\Special", True).DeleteValue("ValueName1", False)
    注:你使用此方法删除叶子子项也是可以的
    [特别主意]
    1)对于使用OpenSubKey方法打开的注册表项必须在OpenSubKey的第二个参数中使用True来指定具有写权限才可以做删除动作;
    2)要删除注册表项的默认键值,请将ValueName置为String.Empty,前提是事前有设置过该注册表项的默认值,否则就会引发异常。删除默认键值只会清除默认键的值,默认键不会消失,如下图:
      vb.net注册表功能您忘了没有来这里最详细的解答您的疑问 b2b软件


    3)非默认键值删除前后又是怎么样的,请看下面的对比图:
          vb.net注册表功能您忘了没有来这里最详细的解答您的疑问 b2b软件

  5.枚举注册表项下所有子项和枚举项下所有键值

   [要点]
      Microsoft.Win32.RegistryKey 对象的 GetSubKeyNames 方法可用于检索包含于此项下所有子项名称的字符串数组。
     Microsoft.Win32.RegistryKey 对象的 GetValueNames 方法可用于检索包含与此项关联的所有值名称的字符串数组。
      [枚举子项]
     Me.ComboBox1.DataSource = My.Computer.Registry.CurrentUser.GetSubKeyNames()
     Me.ComboBox1.DataSource = My.Computer.Registry.CurrentUser.OpenSubKey("Software\ACD Systems", False).GetSubKeyNames
     注:此方法中如果项不存在,则引发异常
     [枚举键值]
     Me.ComboBox1.DataSource = My.Computer.Registry.CurrentUser.OpenSubKey("Software\ACD Systems\ACDSee\110", False).GetValueNames
      注:OpenSubKey第一个参数的起始字符不要是反斜杠"\",否则引发异常,必须的父项的直接子项名,后可反斜杠隔开指定子项的子项。



作者: 枯干枯干    时间: 2017-5-13 03:34
常好,帮了我很大的忙,希望今后老板的生意越来越好,老板加油
作者: w8899    时间: 2017-5-15 16:01
的宝贝,值得学习,还有赠品送,感谢店小二
作者: 123    时间: 2017-5-20 15:10
和5号笨蛋服务非常好
作者: jiandao1    时间: 2017-5-23 11:40
力,好评
作者: xbaobeit    时间: 2017-5-25 09:13
还没看,不过超大容量,内容应该没差吧
作者: xoxo110    时间: 2017-5-29 04:31
值得好评,赞
作者: 枯干枯干    时间: 2017-5-30 07:04
有道理。。。
作者: mm5216299    时间: 2017-5-30 10:36
很细致美观,好评!!
作者: z2340868    时间: 2017-5-31 12:12
及时做出评价,系统默认好评!
作者: ye112219    时间: 2017-6-2 05:22
晚,价格合适,功能齐全,尤其是技术客服服务周到,花很少的钱做很大的事,合作愉快,希望以后更好合作
作者: 脱颖而出    时间: 2017-6-2 06:41
及时做出评价,系统默认好评!
作者: dongwuhua    时间: 2017-6-2 06:58
很牛,服务一流,态度更一流,好评!!!
作者: pxynmi018    时间: 2017-6-2 07:53
卖家!不厌其烦的解释,非常愉快的交易经历!
作者: ebxly    时间: 2017-6-3 11:28
,制作的很精美,非常漂亮。相当满意




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2