C#之操作注册表(RegistryKey类)

Ø C#注册表的操作包括:

A、注册表项的创建,打开与删除。

B、注册表键值的创建(设置值,修改),读取和删除。

C、判断注册表项或者值是否存在。

Ø C#的命名空间

using Microsoft.Win32;

Ø C#常用的类和类中的分支

RegistryKey类。功能:表示Windonws注册表中的顶级节点。

Registry分支:

1、ClassesRoot -->注册表基项HKEY_CLASSES_ROOT --> 包含了所有应用程序运行时必需的信息

2、CurrentUser -->注册表基项 HKEY_CURRENT_USER -->管理系统当前的用户信息

3、Users -->注册表基项HKEY_USERS -->仅包含了缺省用户设置和登录用户的信息

4、LocalMachine -->注册表基项HKEY_LOCAL_MACHINE -->保存了注册表里的所有与这台计算机有关的配置信息

5、CurrentConfig -->注册表基项 HKEY_CURRENT_CONFIG -->允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息

Ø C#创建注册表(CreateSubKey

使用到RegistryKey下的CreateSubKey的方法

         private void found()

        {

            try

            {

                Console.WriteLine("创建注册表:");

                RegistryKey key = Registry.LocalMachine;

                RegistryKey soft = key.CreateSubKey(@"software\test");

                Console.WriteLine("创建注册表成功");

                //在soft下创建test注册表项。

            }

            catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); }

        }

² 在创建注册表的过程中,遇到对HKEY_LOCAL_MACHINE\software\”的访问被拒绝的问题 。。

² 原因是因为程序没以程序管理员的身份去运行。

 

解答方法:

1、--解决方案资源管理器--右键项目名称--属性,找到“安全性”选项,

2、勾选“启用ClickOnce安全设置”,

3、项目下面会多出一个app.manifest”的文件,选中它并,

找到代码段<requestedExecutionLevel level="asInvoker" uiAccess="false" />

将其改为:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

 

4、改正后,不要急于重新编译生成,再次打开“属性--安全性”界面,

“启用ClickOnce安全设置”前面的勾去掉后再编译运行。

5、结束!就可以解决此问题存在。

² 如何检测注册表是否有被创建呢?

如下的代码可以做出判断。

private void ifTable()

        {

            try

            {

                string[]subkeyName;

                RegistryKey rk = Registry.LocalMachine;

                RegistryKey rk1 = rk.OpenSubKey("Software");

 

                //获取Softwar下的所有注册表。

                subkeyName = rk1.GetSubKeyNames();

                foreach(string i in subkeyName)

                {

                    if (i == "test") { Console.WriteLine("test注册表已存在"); }

                }

 

                rk1.Close();

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

        }

Ø C#打开注册表(OpenSubkey

使用到RegistryKey下的OpenSubKey的方法

        private void open()

        {

            Console.WriteLine("打开注册表");

            RegistryKey key = Registry.LocalMachine;

            RegistryKey soft = key.OpenSubKey(@"software\test",true);//指定该表并读取权限

            Console.WriteLine("打开注册表成功");

            //如果该注册表不在会抛出异常

        }

Ø C#删除注册表(DeleteSubKey

使用到RegistryKey下的DeleteSubKey的方法

        private void delete()

        {

            try

            {

                Console.WriteLine("\n删除该指定项");

                RegistryKey key = Registry.LocalMachine;

                key.DeleteSubKey(@"software\test",true);//删除指定项,如果要删除的注册表不存在,则true为报异常,false则不会报异常

                key.Close();

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

        }

Ø C#对注册表进行创建或者修改(SetValue

使用RegistryKey下的SetValue方法

        public void valuecreate()

        {

            try

            {

                Console.WriteLine("\n创建注册表中的键值");

                RegistryKey rk = Registry.LocalMachine;

                RegistryKey rkvalue = rk.OpenSubKey(@"software\test",true);

                //当如果表中存在该键值会直接覆盖之前的键值。

                rkvalue.SetValue("text","博士生");

                Console.WriteLine("创建键值成功");

                rkvalue.Close();

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

            finally 

            {

                ifTabel it = new ifTabel();

                Console.WriteLine("\n判断注册表中的键值是否存在:");

                it.ifTableValue();

            }

        }

² 如何检测该键值是否已经添加到注册表中呢?

如下代码可以实现:

  public void ifTableValue()

        {

            try

            {

                string[] iftablevalueName;

                RegistryKey rk = Registry.LocalMachine;

                RegistryKey rkdelete = rk.OpenSubKey(@"software\test", true);

                iftablevalueName = rkdelete.GetValueNames();

 

                foreach(string i in iftablevalueName)

                {

                    if(i == "text")

                    {

                        Console.WriteLine(i + "该键值存在");

                        return;

                    }

                }

 

                Console.WriteLine("该键值不存在");

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

        }


Ø C#对注册表的键值读取(GetValue

使用RegistryKey下的GetValue方法

        public void valueopen()

        {

            try

            {

                Console.WriteLine("输出指定注册表的键值");

                RegistryKey rk = Registry.LocalMachine;

                RegistryKey rkopen = rk.OpenSubKey(@"software\test",true);

                string value = rkopen.GetValue("text").ToString();

                Console.WriteLine(value.ToString());

                rkopen.Close();

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

        }

}

 

Ø C#对注册表的键值删除(DeleteValue

使用RegistryKeyDeleteValue方法

        public void valuedelete()

        {

            try

            {

                Console.WriteLine("\n删除注册表中的指定值:");

                RegistryKey ry = Registry.LocalMachine;

                RegistryKey rydelete = ry.OpenSubKey(@"software\test",true);

                rydelete.DeleteValue("text");

                Console.WriteLine("删除成功");

                rydelete.Close();

            }

            catch (Exception e) { Console.WriteLine(e.Message.ToString()); }

            finally

            {

                ifTabel it = new ifTabel();

                Console.WriteLine("\n查询删除的键值是否已经被删除");

                it.ifTableValue();

            }

        }

猜你喜欢

转载自blog.csdn.net/qq_23833037/article/details/77104540