首页 > 解决方案 > C# Winforms 从注册表中获取 int 值

问题描述

private void button1_Click(object sender, EventArgs e)
{
      int i = (Int32)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Beerbaum", "TCP_Listening_Delay", null);
      MessageBox.Show(i.ToString());
}

在注册表中有一个名为TCP_Listening_Delay的QWORD 值(64 位),其值为dec:5000

当我按下按钮时,它应该打开一个应该显示 5000 的 MessageBox,但它没有。它所做的只是给我,

“未处理 NullReferenceException”。

标签: c#winformsregistry

解决方案


Registry.GetValue(String, String, Object) 方法

在指定的注册表项中检索与指定名称关联的值。如果在指定的键中找不到名称,则返回您提供的默认值,如果指定的键不存在,则返回 null。

退货

null如果指定的子键keyName不存在;valueName否则,与if关联的值未找到。defaultValuevalueName

但是我认为您的问题是您可能正在尝试从 32/64 位应用程序中读取 64/32 位注册表配置单元

RegistryView 枚举:在 64 位版本的 Windows 上,部分注册表分别存储用于 32 位和 64 位应用程序。32 位应用程序有 32 位视图,64 位应用程序有 64 位视图。

当您使用 OpenBaseKey 和 OpenRemoteBaseKey(RegistryHive, String, RegistryView) 方法以及 RegistryKey 对象的 FromHandle 属性时,可以指定注册表视图。

using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
   using (var subKey = baseKey.OpenSubKey("blah", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl))
   {
      if (subKey != null)
      {
         var value =  subKey.GetValue("Somekey");
      }
   }
}

32 位应用程序未更新 64 位注册表项


推荐阅读