问题描述
- 利用c#代码 访问注册表 不能向注册表里修改数据 求助
- 我要实现的是通过对注册表的修改 实现隐藏和显示桌面图标 谢谢各位
上面的代码就不写了
主要的是
try
{
int i = 1;
RegistryKey key = Registry.CurrentUser;
RegistryKey hide = key.OpenSubKey(@""SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced"" true);
hide.SetValue(""HideIcons""i RegistryValueKind.DWord);
key.Close();
Process[] MyProcess = Process.GetProcessesByName(""explorer"");
MyProcess[0].Kill();
}
catch (Exception ex)
{
MessageBox.Show(""错误!!n"" + ex);
}
现在能修改,把 i=1 改成 i=0就不能修改。注册表默认值是0;就是不能写入0;
各位哥哥姐姐求救!
解决方案
你有没有试过直接在注册表修改软件:Regedit 中手动修改,看看能否成功呢?
理论上,手动与代码修改是一样的。如果手动能修改,说明还是程序哪里有问题。分析是方法是看看每一个函数的返回值,如果出错,再调用 GetLastError 获取一下具体的错误。拿到错误码,就好分析不能修改的原因了。
解决方案二:
这是因为HideIcons键的数据为Reg_DWORD型引起的,你用1是没有问题,但用0不行,参考以下文章试一下吧
C#操作注册表REG_DWORD类型键异常(RegistryValueKind.DWord异常)解决方案
在用C#操作注册表时,如果注册表键的类型是REG_DWORD,有可能遇到溢出BUG。网上这方面的资料很少,在这共享一下。 C#可以用RegistryKey类的SetValue方法来设置键值,例如: 看起来一切正常,但是这个RegistryValueKind.DWord是有问题的。 注册表中的REG_DWORD是无符号32位数值,而C#中的RegistryValueKind.DWord是有符号32位数值。这就意味着RegistryValueKind.DWord的表示范围比REG_DWORD小,因此导致直接传入一些大数时会抛出异常提示类型不正确。 那么如何解决这个BUG呢? 读者可能试图这样做: openKey.SetValue(""NoViewOnDrive""Convert.ToInt32(""ffffffff""16) RegistryValueKind.DWord); 目的是强制把参数转换成32位有符号数,这样是不行的,同样提示异常,因为ffffffff已经超出了有符号32位数的表示范围,无法转换。 或者这样做: openKey.SetValue(""NoViewOnDrive""Convert.ToUInt32 (""ffffffff""16) RegistryValueKind.DWord); 目的是把参数强制转换成无符号32位表示,这样同样不行,SetValue方法内部会自动把参数转换成有符号32位表示,因此,我们的转换是徒劳的,还会被转换回去,而转换回去后,又会提示超出范围。 其实,解决这个问题的方法很简单,只要把转换过程放在unchecked语句里就行了,unchecked语句块内的转换,不做溢出检查,溢出了直接用补码表示。例如:
[csharp] view plaincopyprint?
Int32 tempInt = 0; //预先定义一个有符号32位数
//unchecked语句块内的转换,不做溢出检查
unchecked
{
tempInt = Convert.ToInt32(""ffffffff"" 16); //强制转换成有符号32位数
}
//此时的tempInt已经是有符号32位数,可以直接写入注册表
openKey.SetValue(""NoViewOnDrive"" tempInt RegistryValueKind.DWord);
这样转折一下,就可以成功写入注册表了。
解决方案三:
Int32 tempInt = 0; //预先定义一个有符号32位数
//unchecked语句块内的转换,不做溢出检查
unchecked
{
tempInt = Convert.ToInt32(""ffffffff"" 16); //强制转换成有符号32位数
}
//此时的tempInt已经是有符号32位数,可以直接写入注册表
hide.SetValue(""HideIcons""tempInt RegistryValueKind.DWord);