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;

                    }                   

                }

            }

posted @ 2009-05-01 10:11  trace007  阅读(729)  评论(2编辑  收藏  举报