C#操作注册表的方法详解
本文实例讲述了C#操作注册表的方法。分享给大家供大家参考,具体如下:
下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:注册表项的创建,打开与删除、键值的创建(设置值、修改),读取和删除、判断注册表项是否存在、判断键值是否存在。
准备工作:
1.要操作注册表,我们必须要引入必要的命名空间:
usingMicrosoft.Win32;
在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~
2.命名空间里面提供了一个类:RegistryKey利用它我们可以定位到注册表最开头的分支:
ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig
如:
RegistryKeykey=Registry.LocalMachine;
3.在操作的过程中涉及到子分支,要用\\进行深入,单个\会报错!
4.最后要调用RegistryKey对象的Close()关闭对注册表的修改~~~
5.以下我们的例子都是在LocalMachine分支下,请注意。
一、C#注册表项的创建,打开与删除
1.创建
创建注册表项主要用到RegistryKey的CreateSubKey()方法。如:
RegistryKeykey=Registry.LocalMachine; RegistryKeysoftware=key.CreateSubKey("software\\test"); //在HKEY_LOCAL_MACHINE\SOFTWARE下新建名为test的注册表项。如果已经存在则不影响!
2.打开
打开注册表项主要用到RegistryKey的OpenSubKey()方法。如:
注意,如果该注册表项不存在,这调用这个方法会抛出异常
RegistryKeykey=Registry.LocalMachine; RegistryKeysoftware=key.OpenSubKey("software\\test",true); //注意该方法后面还可以有一个布尔型的参数,true表示可以写入。
3.删除
删除注册表项主要用到RegistryKey的DeleteSubKey()方法。如:
RegistryKeykey=Registry.LocalMachine; key.DeleteSubKey("software\\test",true);//该方法无返回值,直接调用即可 key.Close();
注意,如果该注册表项不存在,这调用这个方法会抛出异常
二、键值的创建(设置值、修改),读取和删除
1.创建(设置值、修改)
对键值的创建修改等操作主要用到RegistryKey的SetValue()方法
RegistryKeykey=Registry.LocalMachine; RegistryKeysoftware=key.OpenSubKey("software\\test",true);//该项必须已存在 software.SetValue("test","毛票票"); //在HKEY_LOCAL_MACHINE\SOFTWARE\test下创建一个名为“test”,值为“毛票票”的键值。如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。 //注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如: //software.SetValue("test","0",RegistryValueKind.DWord);//二进制信息 Key.Close();
2.读取
stringinfo=""; RegistryKeyKey; Key=Registry.LocalMachine; myreg=Key.OpenSubKey("software\\test"); //myreg=Key.OpenSubKey("software\\test",true); info=myreg.GetValue("test").ToString(); myreg.Close();
info结果为:毛票票
3:删除
RegistryKeydelKey=Registry.LocalMachine.OpenSubKey("Software\\test",true); delKey.DeleteValue("test"); delKey.Close();
细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其他例子的不同。
如果你要修改键值,包括创建、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;如果仅仅只是读取键值可以不加,此时可写关闭,你不能再往里写值(当然,你要加也可以true)!
还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操作。
如:
software.SetValue("","毛票票");//在HKEY_LOCAL_MACHINE\SOFTWARE\test修改默认键值的值为“毛票票”。读取类似!
另外,默认的键值是不能删除的,所以不要用DeleteValue()方法去删除,会抛出异常的!
三、判断注册表项是否存在
privateboolIsRegeditItemExist() { string[]subkeyNames; RegistryKeyhkml=Registry.LocalMachine; RegistryKeysoftware=hkml.OpenSubKey("SOFTWARE"); //RegistryKeysoftware=hkml.OpenSubKey("SOFTWARE",true); subkeyNames=software.GetSubKeyNames(); //取得该项下所有子项的名称的序列,并传递给预定的数组中 foreach(stringkeyNameinsubkeyNames) //遍历整个数组 { if(keyName=="test") //判断子项的名称 { hkml.Close(); returntrue; } } hkml.Close(); returnfalse; }
四、判断键值是否存在
privateboolIsRegeditKeyExit() { string[]subkeyNames; RegistryKeyhkml=Registry.LocalMachine; RegistryKeysoftware=hkml.OpenSubKey("SOFTWARE\\test"); //RegistryKeysoftware=hkml.OpenSubKey("SOFTWARE\\test",true); subkeyNames=software.GetValueNames(); //取得该项下所有键值的名称的序列,并传递给预定的数组中 foreach(stringkeyNameinsubkeyNames) { if(keyName=="test")//判断键值的名称 { hkml.Close(); returntrue; } } hkml.Close(); returnfalse; }
补充:x32软件在x64系统下操作注册表,会自动转向到Wow6432Node,为了控制不转向,使用以下代码:
///<summary> ///获得根节点的句柄,常数是固定的 ///</summary> ///<paramname="hive"></param> ///<returns></returns> publicstaticIntPtrGetHiveHandle(RegistryHivehive) { IntPtrpreexistingHandle=IntPtr.Zero; IntPtrHKEY_CLASSES_ROOT=newIntPtr(-2147483648); IntPtrHKEY_CURRENT_USER=newIntPtr(-2147483647); IntPtrHKEY_LOCAL_MACHINE=newIntPtr(-2147483646); IntPtrHKEY_USERS=newIntPtr(-2147483645); IntPtrHKEY_PERFORMANCE_DATA=newIntPtr(-2147483644); IntPtrHKEY_CURRENT_CONFIG=newIntPtr(-2147483643); IntPtrHKEY_DYN_DATA=newIntPtr(-2147483642); switch(hive) { caseRegistryHive.ClassesRoot:preexistingHandle=HKEY_CLASSES_ROOT;break; caseRegistryHive.CurrentUser:preexistingHandle=HKEY_CURRENT_USER;break; caseRegistryHive.LocalMachine:preexistingHandle=HKEY_LOCAL_MACHINE;break; caseRegistryHive.Users:preexistingHandle=HKEY_USERS;break; caseRegistryHive.PerformanceData:preexistingHandle=HKEY_PERFORMANCE_DATA;break; caseRegistryHive.CurrentConfig:preexistingHandle=HKEY_CURRENT_CONFIG;break; caseRegistryHive.DynData:preexistingHandle=HKEY_DYN_DATA;break; } returnpreexistingHandle; }
使用:
///<summary> ///操作注册表 ///</summary> ///<paramname="hive">根级别的名称</param> ///<paramname="path">不包括根级别的名称</param> ///<paramname="parameters">项/(值/值类型)参数</param> ///<paramname="view">注册表视图</param> [RegistryPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)] publicstaticvoidOperateReg(RegistryHivehive,stringpath,Dictionary<string,string[]>parameters,RegistryViewview) { SafeRegistryHandlehandle=newSafeRegistryHandle(GetHiveHandle(hive),true); RegistryKeyr=RegistryKey.FromHandle(handle,view).CreateSubKey(path,RegistryKeyPermissionCheck.ReadWriteSubTree); //一般情况是使用如下代码: //RegistryKeyrk=Registry.LocalMachine.CreateSubKey(path); if(parameters==null&¶meters.Count<=0) return; List<string>keys=parameters.Keys.ToList(); for(inti=0;i<parameters.Count;i++) {//stringtoRegistryValueKind RegistryValueKindrv=(RegistryValueKind)Enum.Parse(typeof(RegistryValueKind),parameters[keys[i]][1].ToString(),true); r.SetValue(keys[i],parameters[keys[i]][0],rv); } }
例子:
publicstaticvoidRegisterScreenCapture(stringtargetDir,stringguid,boolis64BitLync) { if(string.IsNullOrEmpty(guid)) guid="{541a4dc3-50dc-4b4f-a38d-0ed1d360ca6b}"; Dictionary<string,string[]>paraCapture=newDictionary<string,string[]>(); paraCapture["Name"]=newstring[]{"ScreenCapture",RegistryValueKind.String.ToString()}; paraCapture["Path"]=newstring[]{string.Format("{0}IcoLync.ScreenCapture.exe",targetDir),RegistryValueKind.String.ToString()}; paraCapture["Extensiblemenu"]=newstring[]{"ConversationWindowActions",RegistryValueKind.String.ToString()}; paraCapture["SessionType"]=newstring[]{"0",RegistryValueKind.DWord.ToString()}; RegistryViewrv; if(is64BitLync) rv=RegistryView.Registry64; else rv=RegistryView.Default; OperateReg(RegistryHive.LocalMachine,string.Format(@"SOFTWARE\Microsoft\Office\15.0\Lync\SessionManager\Apps\{0}",guid),paraCapture,rv); }
刚才经过测试,不需要GetHiveHandl()也行(我也不知道什么需要);
OperateReg()方法中一二行代码改为
RegistryKeyr=RegistryKey.OpenBaseKey(hive,view).CreateSubKey(path,RegistryKeyPermissionCheck.ReadWriteSubTree);
希望本文所述对大家C#程序设计有所帮助。