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

问题描述

利用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);

时间: 2024-08-04 05:48:43

c# 4 0-利用c#代码 访问注册表 不能向注册表里修改数据 求助的相关文章

代码-如何用VC读取注册表二进制值,比如ShutdownTime?求助~

问题描述 如何用VC读取注册表二进制值,比如ShutdownTime?求助~ 用RegQueryValueEx读取数据,应该放在哪种数据类型中呢,求有效代码~ 下面这段是自己的提取TypedURLsTime的代码.不知问题在哪.. int main() { HKEY hKey; DWORD lpType = REG_BINARY; BYTE time[64]; DWORD timeSize = sizeof(time); RegOpenKeyEx(HKEY_CURRENT_USER, "Soft

用代码访问InfoPath表单内容

表单是MOSS的一个很重要的特性,特别是有了Form Services的支持后,我们在做表单解决方案的时候,经常会用到Infopath, 那么如何使用代码访问保存于SharePoint表单库中的InfoPath表单的内容,是必需知道的. 总结了下,有如下3种方式可实现代码对表单内容的访问: 1.提升表单模板属性 2.通过XmlDocument 对象对表单文件操作 3.反序列化表单数据架构 接下来,分别简单谈谈这3种方法的简单实现步骤 第一种方式: 提升表单模板属性表单操作: 在设计完表单模板,执

Visual C#来删除注册表中的注册信息

visual|注册表 在<用Visual C#读取注册信息>的文中,已经介绍了用 Visual C#来读取注册表中的注册信息.本文就来介绍用Visual C#对注册表的另外一个操作,这也是一个具有破坏性的操作过程--删除注册信息. 在上文中已经知道,由于Visual C#本身没有带类库,他对注册表的处理过程是通过调用.Net FrameWork SDK中的名称空间Microsoft.Win32中封装的二个类来实现的.这二个类就是Registry类.RegistryKey类.在 Registry

windows注册表怎么打开?注册表在哪里进入?

一,windows xp/windows200X进入注册表 1.在开始菜单->运行 中输入 regedit即可进入注册表 二, windows7系统注册表 方法一:"开始"--"所有程序"--"附件"--"命令提示符"(此功能与运行的功能基本相同) 方法二:右键点击"开始菜单"--"属性"--"开始菜单"标签--"自定义"--拖动滑块到最后找

js画表格问题有哪位大哥好心,帮我详细解释一下下面这段代码,主要是位重数据库表里取数据然后用下面这段代码一一的画出表格显示到页面

问题描述 js画表格问题有哪位大哥好心,帮我详细解释一下下面这段代码,主要是位重数据库表里取数据然后用下面这段代码一一的画出表格显示到页面functionreload(){for(vara=0;a<bms.length;a++)for(varb=0;b<shsizes.length;b++){getBookmakerOdds(bms[a],shsizes[b]);}}functiondraw(){varsb=[];for(varkinsds.versus){if(!leagueData[sds

Advanced Installer,搜索注册表,根据注册表选择安装路径

原文:Advanced Installer,搜索注册表,根据注册表选择安装路径 又停了一段时间没有更新了,今天上博客,发现有位朋友就打包的时候需要搜索注册表(不同版本注册表路径不一致,需要搜索多次来确定安装的是哪个版本,然后再来读取之前的安装路径为现在的路径)来实现安装路径自动选择的问题,这里就这个问题来更新一篇关于搜索注册表和设置安装路径的办法,话不多说,开整. 1.确定安装路径所存的变量名称及更改的地方 老鸟可以无视这个步骤,对于新手可以看一下,这里先说结果,安装路径是存在 APPDIR 这

ie注册表-关于IE注册表的时间限制

问题描述 关于IE注册表的时间限制 在通过注册表修改IE设置之后,请问有没有对这个注册表的时间限制,比如点击几次注册表后,注册表会失效,请问这个图片里的内容是什么意思,,谢谢各位大神 解决方案 注册表做IE限制

用Visual C# 来删除注册表中的注册信息

在<用Visual C#读取注册信息>的文中,已经介绍了用 Visual C#来读取注册表中的注册信息.本文就来介绍用Visual C#对注册表的另外一个操作,这也是一个具有破坏性的操作过程--删除注册信息.在上文中已经知道,由于Visual C#本身没有带类库,他对注册表的处理过程是通过调用.Net FrameWork SDK中的名称空间Microsoft.Win32中封装的二个类来实现的.这二个类就是Registry类.RegistryKey类.在RegistryKey类中定义了三个方法来

菜鸟也可以对系统注册表“动手动脚”_注册表

我们都知道注册表在操作系统中起着很重要的作用,于是遇到问题时菜鸟们便忍不住要战战兢兢上阵一试.可是且慢!修改注册表可不是闹着玩的,弄得不好,电脑就会罢工不干了.最近我就差点把系统搞瘫痪了,不过经过向高手请教和自己的摸索,我觉得菜鸟也还是可以对注册表"动手动脚"的,让我们一步一步试试看吧. 第一步:首先在系统分区之外的任一分区建一个文件夹,取名为"注册表秘技"(名字  可任意取).注意,此文件夹一定要建在系统分区以外的分区,以防重装系统时被删除. 第二步:打开注册表编