C#操作注册表
一、原理解析:Windows的心脏
在Win95之前,电脑系统使用INI文本来存取电脑的配置信息,从Win95开始,为了满足更高的要求 ,注册表便出现了。
到了现在,我们完全可以把注册表看作是Windows操作系统的心脏,就像太空站上的生命维持系统一样,维持着系统和应用程序的关联和正常运作。没有注册表的Windows,将无法获取必要信息来运行软件,也无法正确地对用户的命令做出反应,成为名副其实的“空中楼阁”。
二、注册表相关术语:
1、HKEY :“根键”或“主键”,它的图标与资源管理器中文件夹的图标有点儿相像。Windows98将注册表分为六个部分,并称之为 HKEY_name,它意味着某一键的句柄。
2、key(键):它包含了附加的文件夹和一个或多个值。
3、subkey(子键):在某一个键(父键)下面出现的键(子键)。
4、branch(分支):代表一个特定的子键及其所包含的一切。一个分支可以从每个注册表的顶端开始,但通常用以说明一个键和其所有内容。
5、value entry(值项):带有一个名称和一个值的有序值。每个键都可包含任何数量的值项。每个值项均由三部分组成:名称,数据类型,数据。
6、 字符串(REG_SZ):顾名思义,一串ASCII码字符。如“Hello World”,是一串文字或词组。在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成。注册表总是在引号内显示字符串。
7、二进制(REG_BINARY):如 F03D990000BC ,是没有长度限制的二进制数值,在注册表编辑器中,二进制数据以十六进制的方式显示出来。
8、双 字(REG_DWORD):从字面上理解应该是Double Word ,双字节值。由1-8个十六进制数据组成,我们可用以十六进制或十进制的方式来编辑。如 D1234567 。
9、 Default(缺省值):每一个键至少包括一个值项,称为缺省值(Default),它总是一个字串。
三、六大功能键介绍:
1、HKEY_CLASS_ROOT
此根键主要是记录了WINDOWS操作系统中所有数据文件的格式和关联信息,主要记录不同文件的文件名后缀和与之对应的应用程序.其子键(即子目录)可分为两类:一类是已经注册的各类文件名的扩展名,这类子键前面都有一个"."标记;另一类是各类文件类型有关信息
2、HKEY_CURRENT_USER
此根键记录了当前用户的用户配置文件信息.(当不同的用户登录计算机时,它会自动使用自己的个性化设置.)
3、HKEY_LOCAL_MACHINE
这里主要记录了当前计算机的配置数据,包括所有安装的硬件以及软件的设置.这些信息是为所有用户登录系统服务的.它是整个注册表中最强大的,最重要的根键.(不熟悉注册表的兄弟们,最好不要乱修改哦!以免导致系统数据损失或等其他许多故障.)
4、HKEY_USERS
此根键是默认用户的信息(Default子键)和所有以前登录过的用户信息.
5、HKEY_CURRENT_CONFIG
HKEY_CURRENT_CONFIG是在HKEY_LOCAL_MACHINE中当前硬件配置信息的映射,其中存放的是计算机当前设置,如显示器、打印机等外设的设置信息等.它的子键与HKEY_LOCAL_MACHINE"CONFIG"0001分支下的数据是完全一样的.
6、HKEY_DYN_DATA
此根键中保存了每次系统启动时,创建的系统配置和当前性能信息.(但这个根键只存在于WINDOWS 9X中.)
HKEY_PERFORMANCE_DATA
在WINDOWS NT/2000/XP注册表中虽然没有HKEY_DYN_DATA根键,但它即隐藏了一个名为"HKEY_PERFORMANCE_DATA"的键.所有系统中
的动态信息都是存放在此子键中.系统自带的注册表编辑器无法看到此键,但可以用专门的程序来查看此键,如使用性能监视器.
四、程序实例
1、创建
// 在HKEY_CURRENT_USER下创建一个子键Test
RegistryKey test = Registry.CurrentUser.CreateSubKey("Test");
// 在Test下创建两个子键
using (RegistryKey testName = test.CreateSubKey("Name"),testSettings = test.CreateSubKey("Settings"))
{
// 为子键赋值
testSettings.SetValue("Sex", "Male");
testSettings.SetValue("Age", "35");
testSettings.SetValue("ID", 123);
}
2、获取信息、以上面Test为例
Console.WriteLine("在{1}中有{0}个子键:",test.SubKeyCount.ToString(), test.Name);
foreach (string subKeyName in test.GetSubKeyNames())
{
using (RegistryKey tempKey = test.OpenSubKey(subKeyName))
{
Console.WriteLine(""n在子键中{1}有{0}个键值:",tempKey.ValueCount.ToString(), tempKey.Name);
foreach (string valueName in tempKey.GetValueNames())
{
Console.WriteLine("{0,-8}: {1}", valueName,tempKey.GetValue(valueName).ToString());
}
}
}
3、修改
using (RegistryKey testSettings = test.OpenSubKey("Settings", true))
{
Console.WriteLine("修改注册表键值...");
// 修改键值
testSettings.SetValue("Sex", "Female");
testSettings.SetValue("Age", "30");
testSettings.SetValue("ID", 456);
// 输出修改后的信息
Console.WriteLine("完成修改后的注册表键值:");
foreach (string valueName in testSettings.GetValueNames())
{
Console.WriteLine("{0,-8}: {1}", valueName,
testSettings.GetValue(valueName).ToString());
}
}
4、删除
using (RegistryKey testSettings = test.OpenSubKey("Settings", true))
{
Console.WriteLine("删除注册表子键ID...");
// 删除ID键值
testSettings.DeleteValue("id");
// 输出确认信息
Console.WriteLine((string)testSettings.GetValue("id", "ID not found."));
}
5、获取安装软件的位置(位于HKEY_LOCAL_MACHINE"SOFTWARE"Microsoft"Windows"CurrentVersion"App Paths下的子项)
string regname = "SOFTWARE""Microsoft""Windows""CurrentVersion""App Paths";
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regname);
String[] names = rk.GetSubKeyNames();//获取当前注册表的下一级所有
foreach (String prename in names)
{
string regnamelist = regname + """" + prename;
Microsoft.Win32.RegistryKey rklist = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regnamelist);
String[] namelists = rklist.GetValueNames();//获取注册表子项
foreach (string valueName in namelists)
{
switch (valueName)
{
case "Path"://路径位于path中,由于有的没有这个键值,所以过滤一下
Console.WriteLine(rklist.GetValue("Path").ToString());
break;
}
}
}