在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取IE浏览器地址栏的信息、获取"我的电脑"地址栏输入的目录信息、USB近期使用信息等.注冊表项是注冊表的基本组织单位,它包括子表项和值条目.简言之,注冊表项相当于注冊表里的目录.它们存储计算机安装程序的信息,如颜色设置、屏幕大小、历史记录等.

        举个曾经使用注冊表最多的样例:当我们玩魔兽或dota时,总须要打开"执行"->输入"regedit"打开注冊表,在HKEY_CURRENT_USER->Software->Blizzard Entertainment->Warcraft III->Video中改动reswidth(屏幕宽)和resheight(屏幕高).使其屏幕分辩率与游戏一致全屏显示.

        以下就具体解说注冊表的使用.

一.注冊表的结构

       
注冊表(registry)是Windows系统中一个重要的数据库,它用于存储有关应用程序、用户和系统信息.注冊表的结构就像一颗树.树的顶级节点(hive)不能加入、改动和删除.

        例如以下图所看到的是Windows注冊表的顶级节点:



        在C#中对注冊表进行操作,须要引用命名空间:using Microsoft.Win32.

        RegistryKey类表示注冊表中的顶级结点,此类是注冊表的封装.

        Registry类提供表示Windows注冊表中的根项RegistryKey对象,并提供訪问项/值的static方法.经常使用的Registry对象的顶级节点(蜂窝,hive)的属性例如以下表所看到的:

Registry属性 注冊表顶级节点 说明
ClassessRoot HKEY_CLASSES_ROOT 定义文档的类型\类以及与类型关联的信息以及COM组件的配置数据
CurrentConfig HKEY_CURRENT_CONFIG 包括有关非用户特定的硬件的配置信息
CurrentUser HKEY_CURRENT_USER 包括当前登录到Windows的用户的配置信息
LocalMachine HKEY_LOCAL_MACHINE 包括与计算机相关的配置信息,无论用户是否登录
Users HKEY_USERS 包括有关默认用户配置的信息

注冊表中经常使用的数据类型有:

        REG_SZ字符串数据的主要类型,用于存储固定长度的字符串或其它短文本值.我们在实际程序中通常仅仅用这样的数据类型,假设要保存布尔值时,将它表示成0或1.

        REG_BINARY用于存储二进制数据.

        REG_EXPAND_SZ可扩展的字符串值,能够保存在执行时才解析的系统变量.

        REG_MULTI_SZ以数组的格式保存多个文本字符串,每一个字符串"元素"都以null字符结束.

二.注冊表经常用法

          1.创建注冊表键

       
首先先确定在哪个顶级结点下创建键,然后调用CreateSubKey()方法创建.

  1. public RegistryKey CreateSubKey(
  2. string subkey //要创建或打开的子项的名称或路径
  3. )

比如在HKEY_CURRENT_USER下创建键Eastmount和HKEY_CURRENT_USER\Software\Eastmount\test2.当中我们最经常使用的是在\Software这个键下创建程序产品键,保存一些程序的配置在注冊表中.假设Software中没有Eastmount键,则会先创建这个键及其子键.假设存在就不会重写.

  1. //创建键
  2. //在HKEY_CURRENT_USER下创建Eastmount键
  3. RegistryKey test1 = Registry.CurrentUser.CreateSubKey("Eastmount");
  4. //创建键结构 HKEY_CURRENT_USER\Software\Eastmount\test2
  5. RegistryKey test2 = Registry.CurrentUser.CreateSubKey(@"Software\Eastmount\test2");

注意:C#字符串中反斜杠是转义字符,前面加前缀@时,告诉字符串按字面值处理而不进行转义.@"Software\Eastmount\test2"="Software\\Eastmount\\test2".

        执行结果例如以下:

 

        2.打开子键

  1. public RegistryKey OpenSubKey(
  2. string name, //要打开的子项名称或路径
  3. bool writable //假设须要项的写訪问权限=true
  4. )

3.删除注冊表的键

      删除注冊表的键有两个方法: DeleteSubKey()和DeleteSubKeyTree().DeleteSubKey()删除不包含子键的键及其全部值,DeleteSubKeyTree()不仅删除键及其值,还删除键下全部子键(慎用该方法).

  1. //函数原型
  2. public void DeleteSubKey(
  3. string subkey //要删除的子项名称
  4. )
  5. //删除HKEY_CURRENT_USER下创建Eastmount键
  6. Registry.CurrentUser.DeleteSubKey("Eastmount");
  7. //删除创建的子键test2
  8. Registry.CurrentUser.DeleteSubKey(@"Software\Eastmount\test2");

假设键不存在,会有异常错误提示,最好使用try..catch..异常处理.它只删除Software\Eastmount中子项test2而保留Eastmount项.结果例如以下图所看到的:

        
注意:假设使用Registry.CurrentUser.DeleteSubKey(@"Software\Eastmount");它会提示错误"注冊表具有子项,而且此方法不支持递归移除".假设使用Registry.CurrentUser.DeleteSubKeyTree(@"Software\Eastmount")则会删除Eastmount和子项test2.

        4.获取键值

       
Registry.GetValue()检索与指定的注冊表项中的指定名称关联的值.假设keyName指定的子项不存在,则返回null;否则返回与valueName关联的值;假设未找到valueName则返回defaultValue.
  1. public static Object GetValue(
  2. string keyName, //以注冊表顶级节点开头的键的完整路径
  3. string valueName, //名称/值的名称
  4. Object defaultValue //当valueName不存在时返回的值
  5. )

比如获取HKEY_CURRENT_USER\Environment中的path键值.

  1. //获取Environment中路径
  2. string strPath;
  3. strPath = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Environment",
  4. "path", "Return this default if path does not exist");
  5. MessageBox.Show(strPath);

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRWFzdG1vdW50/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

        RegistryKey.GetValue方法能够检索与指定名称关联的值.函数原型public object GetValue(string name).当中參数name表示键的名称.如程序中我获取计算机地址栏输入的信息.

  1. //定义注冊表顶级结点 命名空间Microsoft.Win32
  2. Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey
  3. ("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TypedPaths", true);
  4. //推断键是否存在
  5. if (key != null)
  6. {
  7. //检索包括此项关联的全部值名称 即url1 url2 url3
  8. string[] names = key.GetValueNames();
  9. foreach (string str in names)
  10. {
  11. //获取url中相关联的值
  12. listBox1.Items.Add(key.GetValue(str).ToString());
  13. Num++;
  14. }
  15. //显示获取文件总数
  16. this.textBox1.Text = Num + "个文件";
  17. }

执行结果例如以下图所看到的.事实上还能够获取非常多东西,USB使用信息、浏览器使用信息、软件路径等等.

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRWFzdG1vdW50/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

        5.创建和设置键值

        Registry.SetValue()方法设置指定的注冊表项的指定名称/值对,假设指定的项不存在,则创建该项.

  1. //函数原型
  2. public static void SetValue(
  3. string keyName, //以注冊表顶级节点开头的键的完整路径
  4. string valueName, //名称/值对的名称
  5. Object value //要存储的值
  6. )
  7. //设置键值Version=1.25
  8. Registry.SetValue(@"HKEY_CURRENT_USER\Software\YourSoftware", "Version", "1.25");

注意:每次调用SetValue方法时,它都打开一个注冊表项,设置其值,然后关闭该项.假设须要大批量改动建议使用RegistryKey.SetValue方法.public object SetValue(string name,object value).

        PS:举个简单的样例通过设置我的电脑-{20D04FE0-3AEA-1069-A2D8-08002B30309D}为1,就可以隐藏桌面我的电脑图标.改动为0又能够显示,你知不知道把目录加入".{20D04FE0-3AEA-1069-A2D8-08002B30309D}"后就变成了"我的电脑",能够用来隐藏文件.

  1. RegistryKey rgK = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel");
  2. rgK.SetValue("{20D04FE0-3AEA-1069-A2D8-08002B30309D}",1);

最后希望文章对大家有所帮助,文章主要是自己这段时间对C#调用注冊表信息的总结,一方面讲述了注冊表相关的基础知识,还有一方面通过代码结合图片格式讲述简单运用注冊表.同一时候假设文章中有什么啰嗦或不足之处,还请海涵.

        文章參考自己的项目、MSDN和利用C#操作注冊表

(By:Eastmount 2014-5-11 夜9点半 原创CSDNhttp://blog.csdn.net/eastmount/)

C# 系统应用之注冊表使用具体解释的更多相关文章

  1. 64位Windows操作系统中的注冊表

    x64系统上有x64.x86两种注冊表,记录下. 64 位Windows系统中的注冊表分为 32 位注冊表项和 64 位注冊表项.很多 32 位注冊表项与其对应的 64 位注冊表项同名. 在64位版本 ...

  2. c++ 操作注冊表

    1.       注冊表简单介绍 注冊表是为Windows NT和Windows95中全部32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (W ...

  3. C#注冊表操作汇总

    一.注冊表基本知识 1)       结构 键->项->子项->值项(名称.类型.数据) REG_SZ         字符串 REG_BINARY    二进制 REG_DWORD ...

  4. 《解读window核心编程》 之 注冊表

    1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...

  5. PLSQL Developer过期要注冊表

    打开执行输入 regedit 打表注冊表 删除 HKEY_CURRENT_USER\Software\Allround Automations HKEY_CURRENT_USER\Software\M ...

  6. YII用户注冊表单的实现熟悉前台各个表单元素操作方式

    模还是必须定义两个基本方法.还有部分label标签映射为汉字,假设进行表单验证,还要定义一些验证规则: <? php /* * 用户模型 * */ class user extends CAct ...

  7. VC++ 读写注冊表,注冊文件图标关联

    #include <string> #include <iostream> #include <Windows.h> #include <shlobj.h&g ...

  8. QSettings读写注冊表、配置文件

    简述 普通情况下.我们在开发软件过程中,都会缓存一些信息到本地,能够使用轻量级数据库sqlite.也能够操作注冊表.读写配置文件. 关于QSettings的使用前面已经介绍过了.比較具体,见" ...

  9. 怎样利用WordPress创建自己定义注冊表单插件

    来源:http://www.ido321.com/1031.html 原文:Creating a Custom WordPress Registration Form Plugin 译文:创建一个定制 ...

随机推荐

  1. UbuntuMate开机自动启动ssh服务

    在文件/etc/init/ssh.conf中,有一句 start on filesystem or runlevel [2345] 如果想关闭自动启动的话,把这一局修改为start on runlev ...

  2. 陕西师范大学第七届程序设计竞赛网络同步赛D ZQ的睡前故事【约瑟夫环1-N数到第k个出队,输出出队顺序/ STL模拟】

    链接:https://www.nowcoder.com/acm/contest/121/D来源:牛客网 题目描述 ZQ是一个拥有n女朋友的万人迷,她的每一个女朋友每天晚上都会挨个给他打电话,要他讲了睡 ...

  3. #417 Div2 E (树上阶梯博弈)

    #417 Div2 E 题意 给出一颗苹果树,设定所有叶子节点的深度全是奇数或偶数,并且包括根在内的所有节点上都有若干个苹果. 两人进行游戏,每回合每个人可以做下列两种操作中的一种: 每个人可以吃掉某 ...

  4. 理解竞争条件( Race condition)漏洞

    这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...

  5. java中split任意数量的空白字符

    java程序中经常通过split截取字符串来取得其中的关键字.但是由于其中不同操作系统或者不同作者的习惯,经常会出现不同数量的空格,例如"   "(3个空格):或者出现制表符.Ta ...

  6. Closest Binary Search Tree Value -- LeetCode

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. [BZOJ3920]Yuuna的礼物

    题目大意: 给你一个长度为$n(n\le40000)$的数列$\{a_i\}(1\le a_i\le n)$,给出$m(m\le40000)$次询问,每次给出$l,r,k_1,k_2$询问区间$[l, ...

  8. CURL简单使用

    学习地址:https://yq.aliyun.com/articles/33262 curl的简单使用步骤 要使用cURL来发送url请求,具体步骤大体分为以下四步: 1.初始化2.设置请求选项3.执 ...

  9. 了解一下运行软件的自我保护(RASP)

    看下这篇文章: http://www.jianshu.com/u/c89141b2d51e 相应的demo演示: https://github.com/xbeark/javaopenrasp

  10. nginx rewrite不支持if 嵌套也不支持逻辑或和逻辑并

    如题,apache的rewrite是支持或者的,用个OR就可以,如果不加OR,多个RewriteCond 罗列累加就是并且的意思.然后nginx的rewrite就没有这么好了.那么如何去实现这样复杂的 ...