如何在C#中使用注册表

一、什么是注册表

注册表是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库,用于存储系统和应用程序的设置信息。由键(key,或称“项”)、子键(subkey,子项)和值项(value)构成。一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键。一个值项则是一个键的一条属性,由名称(name)、数据类型(datatype)以及数据(data)组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

(1)、注册表的数据类型主要有以下五种:

(2)、注册表有以下5个一级分支:

(3)、注册表的存储方式:

Windows NT系列操作系统和Windows 9x系列的存储方式有很大区别。注册表被分成多个文件存储,称为Registry Hives,每一个文件被称为一个配置单元。在早期的Windows 3.x系列中,注册表仅包含一个reg.dat文件,所存放的内容后来演变为HKEY_CLASSES_ROOT分支。

Windows NT家族的配置单元文件:

Windows 9x家族的配置单元文件:

二、C#操作注册表

我们可以使用外部加载windows操作系统自带的 Advapi32.dll 文件,实现注册表的操作。下面实例中,我们使用 .NET 平台自带的 Microsoft.Win32.Registry 类库,使用的时候添加如下引用:

using Microsoft.Win32;

具体操作如下:

public static class RegistryUtil
  {
    #region 创建注册表
    /// <summary>
    /// 创建注册表项
    /// </summary>
    /// <param name="keyPath"></param>
    /// <param name="parentKey"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryKey(string keyPath, RegistryKey parentKey)
    {
      return parentKey?.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.LocalMachine">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryLocalMachine64Key(string keyPath)
    {
      return Registry.LocalMachine.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.ClassesRoot">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryClassesRootKey(string keyPath)
    {
      return Registry.ClassesRoot.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.CurrentConfig">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryCurrentConfigKey(string keyPath)
    {
      return Registry.CurrentConfig.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.CurrentUser">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryCurrentUserKey(string keyPath)
    {
      return Registry.CurrentUser.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.PerformanceData">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryPerformanceDataKey(string keyPath)
    {
      return Registry.PerformanceData.CreateSubKey(keyPath);
    }

    /// <summary>
    /// 创建<see cref="Registry.Users">注册表项目
    /// </summary>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey CreateRegistryUsersKey(string keyPath)
    {
      return Registry.Users.CreateSubKey(keyPath);
    }
    #endregion

    #region 打开注册表
    /// <summary>
    /// 打开 <see cref="RegistryView.Registry64"/> 的 <see cref="RegistryHive.LocalMachine"/>
    /// </summary>
    /// <returns></returns>
    public static RegistryKey OpenLocalMachine64Key()
    {
      return RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
    }

    /// <summary>
    /// 打开 <see cref="RegistryView.Registry32"/> 的 <see cref="RegistryHive.LocalMachine"/>
    /// </summary>
    /// <returns></returns>
    public static RegistryKey OpenLocalMachine32Key()
    {
      return RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
    }

    /// <summary>
    /// 打开 <see cref="RegistryView.Registry64"/> 的 <see cref="RegistryHive.CurrentUser"/>
    /// </summary>
    /// <returns></returns>
    public static RegistryKey OpenCurrentUser64Key()
    {
      return RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, RegistryView.Registry64);
    }

    /// <summary>
    /// 打开 <see cref="RegistryView.Registry32"/> 的 <see cref="RegistryHive.LocalMachine"/>
    /// </summary>
    /// <returns></returns>
    public static RegistryKey OpenCurrentUser32Key()
    {
      return RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, RegistryView.Registry32);
    }

    /// <summary>
    /// 打开注册表键
    /// </summary>
    /// <param name="rootKey"></param>
    /// <param name="keyPath"></param>
    /// <returns></returns>
    public static RegistryKey OpenKey(this RegistryKey rootKey, string keyPath)
    {
      return rootKey.OpenSubKey(keyPath, true);
    }
    #endregion

    /// <summary>
    /// 读取注册表值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="name"></param>
    /// <returns></returns>
    public static string ReadRegistryValue(this RegistryKey key, string name)
    {
      return key?.GetValue(name)?.ToString();
    }

    /// <summary>
    /// 写入注册表值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="name"></param>
    /// <param name="value"></param>
    public static void WriteRegistryValue(this RegistryKey key, string name, string value)
    {
      key.SetValue(name, value);
    }

    /// <summary>
    /// 删除注册值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="name"></param>
    public static void DeleteRegistryValue(this RegistryKey key, string name)
    {
      key.DeleteValue(name);
    }
  }

调试代码如下:

static void Main(string[] args)
    {
      // 写入注册表
      string path = @"Software\Test\Char";
      var key = RegistryUtil.CreateRegistryLocalMachine64Key(path);
      key.WriteRegistryValue("Name", "Dwayne");
      key.WriteRegistryValue("Age", "18");

      // 读取注册表
      var regKey = RegistryUtil.OpenLocalMachine64Key().OpenKey(path);
      var name  = regKey.ReadRegistryValue("Name");
      var age  = regKey.ReadRegistryValue("Age");
      Console.WriteLine($"Name={name},Age={age}");

      Console.WriteLine("Hello World!");
    }

以上就是如何在C# 中使用注册表的详细内容,更多关于c# 使用注册表的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用C#在注册表中保存信息的例子

    写出来,方便记忆,以后要用,可以直接改改就能用. 复制代码 代码如下: using System; namespace Backend{    public class RegistryStorage    {        public static PageVisibility OpenAfterStart()        {            Microsoft.Win32.RegistryKey registryKey;            PageVisibility visi

  • c#读写注册表示例分享

    复制代码 代码如下: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为"Test"的子键//如果Test子键已经存在系统会自动覆盖它regWrite = Registry.CurrentUser.CreateSubKey("Software\\Test");//往Test子键里添两条数据项,一条名为"Name",另一条名为"Sex"//值分别

  • C#实现读取注册表监控当前操作系统已安装软件变化的方法

    本文实例讲述了C#实现读取注册表监控当前操作系统已安装软件变化的方法.分享给大家供大家参考.具体实现方法如下: private static HybridDictionary GetSoftName() { string strSoftName = string.Empty; HybridDictionary hdSoftName = new HybridDictionary(); /*对注册表节点"Software/Microsoft/Windows/CurrentVersion/Uninst

  • C#操作注册表的方法详解

    本文实例讲述了C#操作注册表的方法.分享给大家供大家参考,具体如下: 下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1. 要操作注册表,我们必须要引入必要的命名空间: 复制代码 代码如下: using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2. 命名空间里面提供了一个类:RegistryKey 利用它

  • C#操作windows注册表的方法

    本文实例讲述了C#操作windows注册表的方法.分享给大家供大家参考.具体如下: 此代码演示了如何读取和写入注册表 读取注册表: private string GetRegistShellData(string RegistName) { try { string registData, SubregistData; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey(@"SOFTWA

  • C#获取注册表指定键值操作

    某些程序必须依赖指定运行环境.那么读取注册表来判断此电脑是否有执行环境是个很不错的办法.因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的. 那么首先就需要找到那个具体的独一无二的键值,以便程序在运行之前能够去读取以判断. 代码如下: class Program { private static string _sValue = string.Empty; static void Main(string[] args) { Console.WriteLine("请输入待查

  • C#设置自定义文件图标实现双击启动(修改注册表)

    程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中修改信息) //工具启动路径 string toolPath = System.Windows.Forms.Application.StartupPath + "\\邮件小工具.exe"; string extension = SptdConst.FileExtension; string

  • C#通过windows注册表获取软件清单的方法

    本文实例讲述了C#通过windows注册表获取软件清单的方法.分享给大家供大家参考.具体如下: foreach (string SoftwareName in Object.SoftwareList()) { textBox.Text += SoftwareName + Environment.NewLine; } //////////////////////////////////////////////////////////////////////// /// <summary> ///

  • C#设置软件开机自动运行的方法(修改注册表)

    本文实例讲述了C#设置软件开机自动运行的方法.分享给大家供大家参考,具体如下: #region /// <summary> /// 开机启动项 /// </summary> /// <param name="Started">是否启动</param> /// <param name="name">启动值的名称</param> /// <param name="path"

  • 如何在C#中使用注册表

    一.什么是注册表 注册表是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库,用于存储系统和应用程序的设置信息.由键(key,或称"项").子键(subkey,子项)和值项(value)构成.一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键.一个值项则是一个键的一条属性,由名称(name).数据类型(datatype)以及数据(data)组成.一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认

  • 用vbscript得到注册表中是否存在某个值

    问: 嗨,Scripting Guy!如何知道远程计算机上的注册表中是否存在某个值? -- AL 答: 嗨,AL.完全披露时间:尽管我们叫做 Scripting Guy,但这并不表示我们了解有关脚本编写的一切事情.这个问题就是一个很好的例证.第一次看到这个问题时,我们认为:"好吧,WMI 中显然有某种 If Exists 方法可以实现这个目的."但当我们发现其中并没有这样的方法时,知道我们有多吃惊么?事实上,我们找不到任何可以检查注册表中是否存在某个值的方法.我们甚至--惭愧!--去查

  • dos(cmd)中删除、添加、修改注册表命令

    regedit的运行参数 REGEDIT [/L:system] [/R:user] filename1 REGEDIT [/L:system] [/R:user] /C filename2 REGEDIT [/L:system] [/R:user] /E filename3 [regpath] /L:system Specifies the location of the SYSTEM.DAT file. /R:user Specifies the location of the USER.D

  • 二十九、教你备份与恢复Windows 2000注册表

    二十九.教你备份与恢复Windows 2000注册表  Windows 2000将它的配置信息存储在注册表的数据库中,其中包含了每个计算机用户的配置文件,以及有关系统硬件.已安装的程序和属性设置等信息,Windows 2000在运行过程中要一直引用这些信息.注册表是以二进制形式存储在硬盘上,错误地编辑注册表可能会严重损坏系统.所以,在更改注册表之前,强烈建议备份注册表信息.为了防止在修改注册表的时候发生致命错误,有必要了解一下注册表文件的备份和恢复方法.除此之外,为了研究注册表的结构,还可以将注

  • 注册表检查程序Scanreg你用了吗?

    注册表是Windows的命根子,如果注册表损坏了,轻则导致程序运行出错,严重的则会使整个系统崩溃,因此我们要经常做好注册表的检查和维护工作,以保证注册表的安全.在Windows中系统提供了较为实用的注册表检查程序,但许多用户对此程序不太了解,下面就向大家介绍它的具体用法. 在Windows中注册表检查程序有两个,一个是在Windows视窗界面中使用的scanregw.e xe程序,另一个是在DOS方式下使用的scanreg.exe程序.它们的功能和作用都不相同. scanregw.exe程序能够

  • Reg命令使用详解 批处理操作注册表必备

    只有在别无选择的情况下,才直接编辑注册表.注册表编辑器会忽略标准的安全措施,从而使得这些设置会降低性能.破坏系统,甚至要求用户重新安装Windows.可以利用"控制面板"或"Microsoft管理控制台(MMC)"中的程序安全更改多数注册表设置.如果必须直接编辑注册表,则请首先将其备份.使用Reg直接编辑本地或远程计算机的注册表.这些更改有可能造成计算机无法操作并需要重新安装操作系统.所以不要直接编辑注册表,而应尽可能利用"控制面板"或"

  • Node.JS更改Windows注册表Regedit的方法小结

    注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动.硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软.硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件.首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述.状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等. 这里介绍一些通过node.js操作注册表的几种方

  • Win2k注册表备份恢复详解

    Windows 2000 将它的配置信息存储在名为注册表的数据库中,其中包含了每个计算机用户的配置文件,以及有关系统硬件.已安装的程序和属性设置等信息,Windows 2000 在运行过程中要一直引用这些信息.注册表是以二进制形式存储在硬盘上,错误地编辑注册表可能会严重损坏系统.所以,在更改注册表之前,强烈建议备份注册表信息.为了防止在修改注册表的时候发生致命错误,有必要了解一下注册表文件的备份和恢复方法.除此之外,为了研究注册表的结构,还可以将注册表中的某一主键或子键保存为文本文件,或者打印出

  • 注册表REG文件全攻略—注册表使用全攻略之十五

    注册表REG文件全攻略-注册表使用全攻略之十五 1.何谓REG文件 REG文件实际上是一种注册表脚本文件,双击REG文件即可将其中的数据导入到注册表中.利用REG文件我们可以直接对注册表进行任何修改操作,它对注册表的操作可以不受注册表编辑器被禁用的限制,因此功能更为强大.灵活,另外,由于REG文件可以用任何文本文件编辑工具(例如记事本)进行修改,因此通过它对注册表数据进行修改后,如果发生错误,还可以通过改回REG文件中的数据后再导入,从而实现恢复操作,因此它又较之直接用注册表编辑器修改更安全,所

  • 我教你学之注册表基础篇

    注:本文和今后的系列文章中均以Windows XP的注册表为例(与Windows.NET Server注册表相同)来作介绍. 1.1 注册表的概念 Windows的注册表实质上是一个庞大的数据库,用来存储计算机软硬件的各种配置信息其内容有几下几个方面: 软硬件的有关配置和状态信息,应用程序和资源管理器外壳的初始条件.首选项和卸载数据. 计算机整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件的描述.状态和属性. 计算机性能记录和底层的系统状态信息以及各类其它数据. 1.2 注册表与早期i

随机推荐