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_USER\Software\Eastmount\test2.其中我们最常用的是在\Software这个键下创建程序产品键,保存一些程序的配置在注册表中.如果Software中没有Eastmount键,则会先创建这个键及其子键.如果存在就不会重写.

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

        注意:C#字符串中反斜杠是转义字符,前面加前缀@时,告诉字符串按字面值处理而不进行转义.@"Software\Eastmount\test2"="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(@"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.
public static Object GetValue(
	string keyName,        //以注册表顶级节点开头的键的完整路径
	string valueName,      //名称/值的名称
	Object defaultValue    //当valueName不存在时返回的值
)

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

//获取Environment中路径
string strPath;
strPath = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Environment",
    "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_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}"后就变成了"我的电脑",可以用来隐藏文件.

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

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

目录
相关文章
|
16天前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
26 1
|
1月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
21 1
|
1月前
|
安全 测试技术 C#
C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?
C#手术麻醉系统源码集成到医院信息系统涉及标准数据接口、患者信息同步、医嘱报告共享、实时监测数据传输及安全权限管理。通过这些步骤,确保信息的准确、及时和安全流动,提升医疗效率和服务质量。系统集成后需测试优化,以保证稳定性。图片展示了集成的不同方面。
13 0
|
1月前
|
传感器 数据采集 大数据
C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码
手麻系统从麻醉医生实际工作环境和流程需求方面设计,与HIS,LIS,PACS,EMR无缝连接,方便查看患者的信息;实现术前、术中、术后手术麻醉信息全记录;减少麻醉医师在手术中填写麻醉记录单时间,证手术麻醉相关信息的准确性,有效降低医护人员的术中书写医疗文书的压力,使得麻醉医生在术中能够更加集中精力在病人的麻醉操作上,提升手术质量
19 2
|
3天前
|
存储 数据采集 API
C# GetField 方法应用实例
C# GetField 方法应用实例
|
3天前
|
JSON 安全 API
C# GetMethod 方法应用实例
C# GetMethod 方法应用实例
|
15天前
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
18 0
|
18天前
|
开发框架 Linux C#
C#编程的跨平台应用
【4月更文挑战第21天】C#与.NET Core的结合使得跨平台应用开发变得高效便捷,提供统一编程模型和高性能。丰富的类库、活跃的社区支持及Visual Studio Code、Xamarin等工具强化了其优势。广泛应用在企业系统、云服务和游戏开发中,虽面临挑战,但随着技术进步,C#在跨平台开发领域的前景广阔。
|
23天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
22 0
|
1月前
|
传感器 数据采集 安全
C#智慧医院手麻系统源码 医院手术麻醉系统源码 支持三甲医院评级需求 可提供演示
手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期,对病人进行全程跟踪与信息管理,自动集成病人HIS、LIS、RIS、PACS信息,采集监护等设备数据,根据质控要求自动生成电子单据,把麻醉医生从繁重的单据记录中解放出来,从而有更多时间为手术顺利进行保驾护航。麻醉信息管理系统覆盖了从患者入院,经过术前、术中、术后,直至出院的全过程。通过与医院信息系统的信息集成,与监护设备的数据集成,实现了围术期患者信息的自动采集与共享,建立围术期电子病历
14 0