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