VB.NET中在HKEY_LOCAL_MACHINE\Software下读写注册表值的问题
嘿,我来帮你搞定这个注册表操作的问题!你的代码现在是直接在HKEY_LOCAL_MACHINE根目录下操作值,但你需要的是在HKEY_LOCAL_MACHINE\Software子项里读写,问题出在参数的传递方式上,我给你一步步修正:
问题根源
你当前的代码:
My.Computer.Registry.LocalMachine.SetValue("Study", "1")
这里第一个参数"Study"被当作了根目录下的值名称,所以会直接在HKLM根键创建Study值,而不是在Software子项里。
正确的读写代码
1. 基础版(适用于简单场景)
如果只是要在HKLM\Software子项中直接读写Study值,只需要调整参数:
- 设置值:
' 第一个参数是子项路径"Software",第二个是值名称"Study",第三个是值内容 My.Computer.Registry.LocalMachine.SetValue("Software", "Study", "1") - 读取值:
' 第一个参数指定子项"Software",第二个是要读取的值名称"Study" Dim RegistryCheck As String = My.Computer.Registry.LocalMachine.GetValue("Software", "Study")
2. 进阶版(处理权限和64位系统重定向)
因为HKLM\Software是系统级注册表项,有两个常见坑需要注意:
- 管理员权限:写入该路径需要程序以管理员身份运行,否则会抛出权限异常。你可以在项目属性的「安全性」里启用UAC,设置权限级别为
requireAdministrator。 - 64位系统重定向:32位程序会被自动重定向到
HKLM\Software\Wow6432Node,如果要访问64位注册表项,需要用RegistryKey的API手动指定视图:' 设置64位注册表项的值 Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) Using softwareKey As RegistryKey = baseKey.OpenSubKey("Software", True) ' True表示可写 softwareKey.SetValue("Study", "1") End Using End Using ' 读取64位注册表项的值 Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) Using softwareKey As RegistryKey = baseKey.OpenSubKey("Software", False) ' False表示只读 Dim RegistryCheck As String = softwareKey.GetValue("Study").ToString() End Using End Using
额外提示
通常不建议直接在HKLM\Software根下创建值,最好创建自己的应用程序子项(比如HKLM\Software\YourAppName),这样更规范,也避免和其他软件的注册表项冲突:
' 设置自定义子项的值 My.Computer.Registry.LocalMachine.SetValue("Software\YourAppName", "Study", "1") ' 读取自定义子项的值 Dim RegistryCheck As String = My.Computer.Registry.LocalMachine.GetValue("Software\YourAppName", "Study")
内容的提问来源于stack exchange,提问作者Swastik Bhattacharyya
相关产品推荐
相关产品推荐

