zoukankan      html  css  js  c++  java
  • C# 系统应用之注冊表使用具体解释

            在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取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()方法创建.

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

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

    //创建键
    //在HKEY_CURRENT_USER下创建Eastmount键
    RegistryKey test1 = Registry.CurrentUser.CreateSubKey("Eastmount");
    //创建键结构 HKEY_CURRENT_USERSoftwareEastmount	est2
    RegistryKey test2 = Registry.CurrentUser.CreateSubKey(@"SoftwareEastmount	est2");

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

     
            2.打开子键

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

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

    //函数原型
    public void DeleteSubKey(
    	string subkey    //要删除的子项名称
    )
    //删除HKEY_CURRENT_USER下创建Eastmount键
    Registry.CurrentUser.DeleteSubKey("Eastmount");
    //删除创建的子键test2
    Registry.CurrentUser.DeleteSubKey(@"SoftwareEastmount	est2");

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

             注意:假设使用Registry.CurrentUser.DeleteSubKey(@"SoftwareEastmount");它会提示错误"注冊表具有子项,而且此方法不支持递归移除".假设使用Registry.CurrentUser.DeleteSubKeyTree(@"SoftwareEastmount")则会删除Eastmount和子项test2.
            4.获取键值
           
    Registry.GetValue()检索与指定的注冊表项中的指定名称关联的值.假设keyName指定的子项不存在,则返回null;否则返回与valueName关联的值;假设未找到valueName则返回defaultValue.
    public static Object GetValue(
    	string keyName,        //以注冊表顶级节点开头的键的完整路径
    	string valueName,      //名称/值的名称
    	Object defaultValue    //当valueName不存在时返回的值
    )

            比如获取HKEY_CURRENT_USEREnvironment中的path键值.

    //获取Environment中路径
    string strPath;
    strPath = (string)Registry.GetValue(@"HKEY_CURRENT_USEREnvironment",
        "path", "Return this default if path does not exist");
    MessageBox.Show(strPath);


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

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

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

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

    //函数原型
    public static void SetValue(
        string keyName,        //以注冊表顶级节点开头的键的完整路径
    	string valueName,      //名称/值对的名称
    	Object value           //要存储的值
    )
    //设置键值Version=1.25
    Registry.SetValue(@"HKEY_CURRENT_USERSoftwareYourSoftware", "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}"后就变成了"我的电脑",能够用来隐藏文件.

    RegistryKey rgK = Registry.CurrentUser.CreateSubKey(@"SoftwareMicrosoftWindowsCurrentVersionExplorerHideDesktopIconsNewStartPanel");
    rgK.SetValue("{20D04FE0-3AEA-1069-A2D8-08002B30309D}",1);

            最后希望文章对大家有所帮助,文章主要是自己这段时间对C#调用注冊表信息的总结,一方面讲述了注冊表相关的基础知识,还有一方面通过代码结合图片格式讲述简单运用注冊表.同一时候假设文章中有什么啰嗦或不足之处,还请海涵.
           
    文章參考自己的项目、MSDN和
    利用C#操作注冊表
    (By:Eastmount 2014-5-11 夜9点半 原创CSDNhttp://blog.csdn.net/eastmount/)

  • 相关阅读:
    阿里云oss怎么上传文件夹
    HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法
    让富文本编辑器支持复制doc中多张图片直接粘贴上传
    CSDN-markdown 文字样式设置(字体, 大小, 颜色, 高亮底色)
    网络编程基础知识点
    inet_addr 和inet_ntoa函数作用
    sockaddr和sockaddr_in的区别
    简析TCP的三次握手与四次分手
    TCP三次握手和四次挥手原理分析
    htons(), ntohl(), ntohs(),htons() 函数功能
  • 原文地址:https://www.cnblogs.com/llguanli/p/6815639.html
Copyright © 2011-2022 走看看