2012-01-26 176 views
2

我似乎无法让我的程序正确读取注册表。下面是我目前的代码,但我也尝试了其他的东西。它编译并运行,但它总是返回一个零。 (我在注册表双重检查,并将其值设置为一个。“0x000000001(1)”我想访问的关键是为DWord,和值应该只是一个1或0。我正在为管理员,所以我有完全访问权限。我在做什么错?获取注册表值C#

Registry.LocalMachine.OpenSubKey("SOFTWARE", true); 
RegistryKey masterKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"); 
string value = ""; 
if(masterKey != null) 
{ 
    value = masterKey.GetValue("OEMbackground", 2).ToString(); 
} 
masterKey.Close(); 
myLabel.Text=value; 
+2

你是在x86进程中运行? –

+0

在Windows上你的代码工作7 - 32位 –

+0

好点 - 如果你的过程是4位,那么该路径将是:HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \认证\ LogonUI \背景 – 2012-01-26 04:20:13

回答

4

我怀疑你是一个64位的机器上运行,但作为一个32位的过程,即价值可能并不存在于32位注册表中,而是存储在64位注册表中(我的情况当然是这样),您可能需要访问64位配置单元才能读取该值,从32位处理过程来看是一个问题。

const string keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background"; 
using (var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
using (var key = hklm64.OpenSubKey(keyPath)) 
{ 
    var value = (int)key.GetValue("OEMBackground", 2); 
} 
+0

PS,你”需要在.NET 4上运行以获得如下所示的备用视图。如果不是的话,你可能会想要明确地定位到x64以获得该值。 –

+0

谢谢!正是我需要的。 我可以做基本相同的事情来访问从32位进程的64位系统上的Windows \ System32? – Usta

+0

当然,我不明白为什么你不能。 –