z1326489034
愿你与天斗
2015-06-17 00:06
采纳率: 100%
浏览 2.4k

利用c#代码 访问注册表 不能向注册表里修改数据 求助

我要实现的是通过对注册表的修改 实现隐藏和显示桌面图标 谢谢各位
上面的代码就不写了
主要的是
try
{
int i = 1;
RegistryKey key = Registry.CurrentUser;
RegistryKey hide = key.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 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;
各位哥哥姐姐求救!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • lzp_lrp
    WorldMobile 2015-06-17 00:47
    已采纳

    Int32 tempInt = 0; //预先定义一个有符号32位数
    //unchecked语句块内的转换,不做溢出检查
    unchecked
    {
    tempInt = Convert.ToInt32("ffffffff", 16); //强制转换成有符号32位数
    }
    //此时的tempInt已经是有符号32位数,可以直接写入注册表
    hide.SetValue("HideIcons",tempInt, RegistryValueKind.DWord);

    点赞 评论
  • 91program
    91program 2015-06-17 00:13

    你有没有试过直接在注册表修改软件:Regedit 中手动修改,看看能否成功呢?
    理论上,手动与代码修改是一样的。如果手动能修改,说明还是程序哪里有问题。分析是方法是看看每一个函数的返回值,如果出错,再调用 GetLastError 获取一下具体的错误。拿到错误码,就好分析不能修改的原因了。

    点赞 评论
  • lzp_lrp
    WorldMobile 2015-06-17 00:45

    这是因为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);

         这样转折一下,就可以成功写入注册表了。
    
    点赞 评论
  • qq_38048360
    qq_38048360 2017-08-01 09:11

    这样是不行,我也测过了,该怎么解决?

    点赞 评论

相关推荐