使用C#制作简易的注册表编辑器



本文节选自《21天学通C#》一书

     下面来实现一个简易的注册表编辑器。它具备了Windows操作系统自带的注册表编辑器的一般功能。如示例代码19
-7所示。

示例代码19
-7
      主窗体。主窗体在启动时,会在加载事件中加载注册表到树形控件中,就像在Windows操作系统中的注册表编辑器一样。

    代码如下所示。
01    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
02    {
03         Try                                                //可能会引发异常
04         {
05             strInfo = this.TVRegedit.SelectedNode.Parent.Text;
06         }
07         Catch
08         {
09             strInfo = string.Empty;                    //清空
10         }
11         str = e.Node.Text;                                //获取节点的值
12         if (strInfo != string.Empty)                    //如果选择节点不是空的
13         {
14             this.label2.Text = strInfo + "\\" + str;        
                                                                
//显示选取节点的名称
15         }
16         else
17         {
18             this.label2.Text =str;                //否则保留上次的值
19         }
20    } 
      创建注册键,代码如下所示。
01    private void button1_Click(object sender, EventArgs e)
02    {
03          string keyName=this.label2.Text.Trim().ToString()+"\\"+this.textBox1. Text.Trim().ToString();
04          object obj=(object)this.textBox2.Text.Trim();                        //进行类型转换
05          string strName = this.textBox3.Text.Trim().ToString();            //为变量赋值
06          if (strReader != string.Empty)                                    //如果选了添加注册键的类型
07          {
08               switch (strReader)                                            //多分支选择
09               {
10               case "1":                                                        //如果选择了“字符串值”铵钮
11                   {
12                       Registry.SetValue(keyName, strName, obj, RegistryValueKind. String);
13                       break;
14                   }
15               case "2":                                                        //如果单击了“可扩充字符串值”按钮
16                   {
17                       Registry.SetValue(keyName, strName, obj, RegistryValueKind. ExpandString);
18                       break;
19                   }
20               }
21          this.Banding();                                                        //重新刷新窗体
22          }
23          else
24          {
25              MessageBox.Show("请选择创建方式(例如字符串型)");
                                                                                    
//错误提示
26          }
27    }
      设置字符串的值,代码如下所示。
01    private void radioButton1_CheckedChanged(object sender, EventArgs e)
02    {
03         if (this.radioButton1.Checked)                                    //单击了“字符串值”按钮
04         {
05              strReader = "1";                                                //将变量赋值为1
06         }
07    }
08    private void radioButton2_CheckedChanged(object sender, EventArgs e)
09    {
10        if (this.radioButton2.Checked)                                    //如果单击了“扩充的字符串字”按钮
11        {
12            strReader = "2";                                                //将变量赋值为2
13        }
14    }
15    private void Banding()                                                    //对窗体进行绑定
16    {
17         this.TVRegedit.Nodes.Clear();                                        //清空节点
18         RegistryKey rkRoot=Registry.ClassesRoot;
19         RegistryKey rkUse= Registry.CurrentUser;
20         RegistryKey rkMachine=Registry.LocalMachine;
21         RegistryKey rkUsers = Registry.Users;
22         RegistryKey rkConfig= Registry.CurrentConfig;
23         TreeNode tRoot = new TreeNode("HKEY_CLASSES_ROOT");
24         foreach (string si in rkRoot.GetSubKeyNames())
25         {
26              tRoot.Nodes.Add(si.ToString());
27         }
28         TreeNode tUse = new TreeNode("HKEY_CURRENT_USER");
29         foreach (string si in rkUse.GetSubKeyNames())
30         {
31              tUse.Nodes.Add(si.ToString());
32         }
33         TreeNode tMachine = new TreeNode("HKEY_LOCAL_MACHINE");
34         foreach (string si in rkMachine.GetSubKeyNames())
35         {
36             tMachine.Nodes.Add(si.ToString());
37         }
38         TreeNode tUsers = new TreeNode("HKEY_USERS");
39         foreach (string si in rkUsers.GetSubKeyNames())
40         {
41              tUsers.Nodes.Add(si.ToString());
42         }
43         TreeNode tConfig = new TreeNode("HKEY_CURRENT_CONFIG");
44         foreach (string si in rkConfig.GetSubKeyNames())
45         {
46              tConfig.Nodes.Add(si.ToString());
47         }
48         this.TVRegedit.Nodes.Add(tRoot);
49         this.TVRegedit.Nodes.Add(tUse);
50         this.TVRegedit.Nodes.Add(tMachine);
51         this.TVRegedit.Nodes.Add(tUsers);
52         this.TVRegedit.Nodes.Add(tConfig);
53    }
      
    刷新注册表,对窗体绑定的值全部清掉,重新加载。代码如下所示。
01    private void button3_Click(object sender, EventArgs e)
02    {
03         this.Banding();                                            //刷新窗体,就是重新绑定
04    }
      
    创建项,代码如下所示。
01    private void button2_Click(object sender, EventArgs e)
02    {
03        RegistryKey rky = Registry.CurrentConfig.CreateSubKey(this.textBox4.Text. Trim().ToString());
04        this.Banding();                                            //重新绑定窗体中的值
05    }
      
    删除指定的项,代码如下所示。
01    private void button4_Click(object sender, EventArgs e)
02    {
03         string str = this.label2.Text.Trim().ToString();    
                                                                        
//获取label2中的值
04         str=str.Substring(str.IndexOf("\\")+1);                //查字符串里面是否包含的值
05         if(MessageBox.Show("是否删除?""提示"
06         MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
07         {
08             Registry.CurrentConfig.DeleteSubKeyTree(str);//删除指定的项
09             this.Banding();                                        //刷新窗体
10         }
11    }
      
    显示项,代码如下所示:
01    private void button5_Click(object sender, EventArgs e)
02    {
03        string str = this.label2.Text.Trim().ToString();    //获取label2的中的值
04        string defalutResut;                                    //定义一个变量
05        if (str.IndexOf("\\"!= -1)                            //查字符串里面是否包含的值
06        {
07             defalutResut = str.Substring(0, str.IndexOf("\\"));
                                                                    
//查字符串里面是否包含的值
08             str = str.Substring(str.IndexOf("\\"+ 1); //查字符串里面是否包含的值
09        }
10        else
11        {
12             defalutResut = str;
13        }
14        switch (defalutResut)                                //进行分支选择
15        {
16        case "HKEY_CLASSES_ROOT":                    //如果是HKEY_CLASSES_ROOT项
17             {
18                rkey = Registry.ClassesRoot;                //选取项
19                break;                                            //跳出分支
20             }
21         case "HKEY_CURRENT_USER":                    //如果是HKEY_CURRENT_USER项
22              {
23                 rkey = Registry.CurrentUser;                //选取项
24                 break;                                        //跳出分支
25              }
26         case "HKEY_LOCAL_MACHINE":                //如果是HKEY_LOCAL_MACHINE项
27              {
28                  rkey = Registry.LocalMachine;            //选取项
29                  break;                                        //跳出分支
30              }
31         case "HKEY_USERS":                            //如果是HKEY_USERS项
32              {
33                  rkey = Registry.Users;                    //选取项
34                  break;                                        //跳出分支
35              }
36         case "HKEY_CURRENT_CONFIG":                //如是HKEY_CURRENT_CONFIG项
37              {
38                  rkey = Registry.CurrentConfig;            //选取项
39                  break;                                        //跳出分支
40              }
41         }
42         Try                                                    //可能引发异常
43         {
44               RegistryKey rkeyS = rkey.OpenSubKey(str);
45               if (rkeyS.ValueCount>0)            //如果打开的注册键不为空
46               {
47                    foreach (string strValue in rkeyS.GetValueNames())
48                    {
49                          MessageBox.Show(strValue + "项的值是:" + rkeyS.GetValue (strValue).ToString());
50                          break;
51                    }
52               }
53               else
54               {
55                   MessageBox.Show("无显示值");            //输出提示信息
56               }
57          }
58          Catch
59          {
60              MessageBox.Show("无显示值");                //输出提示信息
61          }
62    }
    【运行结果】选择“调试”
|“启动调试”命令运行程序,结果如图19.9所示。
 
    图19.
9  注册表编辑器
        
    【范例19
-8】可能有的读者在使用一些优化操作系统的软件,例如Windows优化大师。
    
    它有的一些功能就是通过优化注册表实现的。下面就演示优化系统的一些实例,
    
    例如,实现加快菜单显示速度的功能等。如示例代码19
-8所示。
    
    示例代码19
-8
01    using Microsoft.Win32;                                    //注册表命名空间
02    namespace Ex_19_8
03    {
04        public partial class Form1 : Form
05        {
06            public Form1()                                    //窗口类的构造函数
07            {
08                InitializeComponent();                        //完成窗口初始化
09            }
10            private void button1_Click(object sender, EventArgs e)
                                                                    
//单击事件,修改刷新速度
11            {
12                try                                                //可能有异常,放在try块中
13                {
14                    RegistryKey rek =                        //声明一个变量
15                    Registry.LocalMachine.CreateSubKey(@"System\CurrentControlSet\Control\Update");
16                    rek.SetValue("UpdateMode",0);        //向注册键写入新的值
17                    MessageBox.Show("修改刷新速度成功!");    
                                                    
//提示修改信息
18                }
19                catch(Exception ey)                        //捕获异常信息
20                {
21                    MessageBox.Show("程序不合适此操作系统");
22                }
23            }
24            private void button2_Click(object sender, EventArgs e)
                                                                
//单击事件,修改菜单显示速度
25            {
26                try                                            //可能有异常,放在try块中
27                {
28                    RegistryKey rek = Registry.LocalMachine.CreateSubKey(@"Control Panel\Desktop");
29                    rek.SetValue("MenuShowDelay",0);    
                                                
//向注册键写入新的值
30                    MessageBox.Show("修改菜单显示速度成功!");    
                                                
//提示修改信息
31                }
32                catch(Exception ey)                    //捕获异常信息
33                {
34                     MessageBox.Show("程序不合适此操作系统");
35                }
36            }
37        }
38    }
    
    【运行结果】选择“调试”
|“启动调试”命令运行程序。

转载于:https://www.cnblogs.com/wequst/articles/1415181.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世博游览技巧

世博游览技巧 方案一: 一日进园 步骤1:4:50-5:30到达5号门3号口 07:00开园后最大速度向后面的安检口跑 看到少于30人就可以拿到中国的预约(也就是安检的前3排) 09:00安检后就会有人发中国的预约券(可以不按预约的时间…

node 16位 转24位_同时将24位和32位BMP图像顺时针旋转90度

上一次我们将24位的皮卡丘旋转了90度,但是后来改需求了。。。要求把32位的.bmp文件也能够旋转90度。上次就懵逼的我继续懵逼,只好继续转向CSDN求助。浏览了各种求助帖(还找到了数年前的信科大一学长),终于发现了32位和…

这几个关乎我们一生教养的原则,每个人都应该知道。

▲ 点击查看最近刷到这样两条微博,让人心头一暖。一条是杭州一个小男孩给医院捐款千元,还附上了一封感谢信。临走时还给医生敬了个少先队礼。另一条是扬州一名女孩把自己的小黄鸭储蓄罐整个捐到派出所,留下一张写着“武汉加油”的纸条&#x…

莫名其妙的主机名 VM_32_234_centos

在腾讯服务器上部署的时候出现的莫名其妙的错误, 我在配置文件上都写 master, node1, 但是运行mapredure的时候的时候老是出现 Job job_1409546978133_0001 failed with state FAILED due to: Application application_1409546978133_0001 failed 2 times due to Error launc…

如何通过提问成为更好的开发人员

如何通过提问成为更好的开发人员这是新的一年的开始,所以我想以一篇我已经计划写了一段时间但从未真正开始创作的帖子开始。我最近开始了一份新工作,加入Elastic[1],负责开发他们的 .NET 语言客户端。因此,最终将这个主题编写并发…

生活经典名句

1,记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的 2,能冲刷一切的除了眼泪,就是时间,以时间来推移感情,时间越长,冲突越淡,仿佛不断稀释…

转载 一篇UI规范文件

这是一个UI模板规范,在做B/S版应用程序时比较适用,其实这样的东西算不上什么正规的规范,只是为了适应我们现在面对的开发环境和组织流程做的一些权宜的努力,和解决了一些与程序沟通和接口的问题,尽量避免误会和摩擦。 …

怎么提交 checkbox 表单_8. html form表单

“仅供学习,转载请注明出处”form表单表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,相关标签及属性用法如下:1、标签 定义整体的表单区域action属性 定义表单数据提交地址method属性 定义表单提交的方式,…

越来越多的人不刷朋友圈竟然是因为.....

全世界只有3.14 % 的人关注了爆炸吧知识有些人,生活离不开朋友圈朋友圈是他们展示自我、观察世界的一扇窗户而有些人,从来也不点开朋友圈他们更愿意利用地铁上的零散化时间看点有意义、有知识的公众号推送完成对自我知识库的更新今天为大家推荐以下优质订…

Java基础---变量(三)

简单的说,我们可以把变量看作是个盒子,可以将钥匙、手机、饮料等物品存放在这个盒子中,也可以在需要的时候换成我们想存放的新物品。在 Java 中,我们通过三个元素描述变量:变量类型、变量名以及变量值。如果我们把变量…

批处理文件总结(三)

三.如何使用组合命令(Compound Command)   1.amp;   Usage:第一条命令 amp; 第二条命令 [amp; 第三条命令...]   用这种方法可以同时执行多条命令,而不管命令是否执行成功   Sample:   C:\>dir z: amp; dir c:\Ex4rch   The s…

腾讯,1000 亿!

聊聊腾讯的开源技术大家好,我是鱼皮,最近一则新闻在公司内外闹得沸沸扬扬,就是下面这个:为了履行企业发展使命,促进高质量发展的共同繁荣,腾讯在投资 500 亿元启动 “可持续社会价值创新” 战略后&#xff…

线打断问题(转)

在处理数据时,我们经常会遇到线打断的问题,比如需要指定在线上某处打断线,或者新建网络数据集时需要在线的交点处打段线等等。现将桌面版中我所遇到的线打断的工具总结如下: 一、手工打断线 Editor工具条中的splittool。 使用该工…

php mysql 执行sql文件_PHP执行SQL文件并将SQL文件导入到数据库_PHP

//读取文件内容$_sql file_get_contents(test.sql);$_arr explode(;, $_sql);$_mysqli new mysqli(DB_HOST,DB_USER,DB_PASS);if (mysqli_connect_errno()) {exit(连接数据库出错);}//执行sql语句foreach ($_arr as $_value) {$_mysqli->query($_value.;);}$_mysqli->…

What?你还搞不懂什么是物体检测?

全世界只有3.14 % 的人关注了爆炸吧知识计算机视觉在上一个世纪60年代脱胎于人工智能与认知神经科学,并旨在通过设计算法来让计算机自动理解图像的内容。于是为了“解决”这类机器视觉的问题,麻省理工在1966年正式将这个问题作为一个夏季项目&#xff0c…

IIS服务器上增加mp4格式MIME 类型映射设置具体步骤

2019独角兽企业重金招聘Python工程师标准>>> 也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就 表明mp4格式文件是服务器无法识别的,其…

WPAD原理介绍暨故障排查:ISA2006系列之三

WPAD的部署原理暨故障排查<?XML:NAMESPACE PREFIX O />WPAD是Web Proxy Auto Discovery的缩写&#xff0c;意思是Web代理服务器自动发现。WPAD的设计目的是让浏览器能自动发现代理服务器&#xff0c;这样用户可以轻松访问互联网而且无需知道哪台计算机是代理服务器。在…

Web服务器HttpServer(嵌入式设备)

HttpServer是一个轻量级Web服务器&#xff0c;用于在嵌入式设备以及客户端环境中提供简单Web服务。HttpServer支持路由映射到匿名委托、WebApi接口、静态文件&#xff0c;以及具有多个接口的控制器类。从简单到复杂&#xff0c;控制权交给开发者。源码&#xff1a;https://gith…

RFileWriteStream 写入汉字

由于用到 RFileWriteStream 写入汉字到文件中&#xff0c;之前没有处理过&#xff0c;等写入文件后才发现是乱码。 问了问群里的朋友也没有解决&#xff0c;后来就上网搜&#xff0c;终于找到一个解决方法&#xff0c;就是用 CCnvCharacterSetConverter 类 这个类是用来转换Uni…

mysql同时查两张表数据库表_如何同时查询两个数据库表?

展开全部 sql多表关联查询跟条件查询大同小异,主要是要知道表与表之前的关系很重e69da5e6ba9062616964757a686964616f31333431353238要; 举例说明:(某数据库中有3张表分别为:userinfo,dep,sex) userinfo(用户信息表)表中有三个字段分别为:user_di(用户编号),user_name(用…