Ø 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)
使用RegistryKey的DeleteValue方法
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();
}
}