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

使用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    }
【运行结果】选择“调试”|“启动调试”命令运行程序。

posted @ 2008-12-30 08:03  我的javaIT  阅读(302)  评论(0编辑  收藏  举报