C# 系统应用之注册表使用详解

2023-11-11

        在平时做项目时,我们有时会遇到注册表的操作,例如前面我们需要获取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/)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 系统应用之注册表使用详解 的相关文章

  • 卸载程序不删除注册表

    Function Check32or64BitWindows If RunningX64 strcpy INSTDIR PROGRAMFILES64 APP FULL PATH SetRegView 64 Else SetRegView 3
  • 使用 powershell 加载 ntuser.dat

    我需要检查网络中 Windows 客户端上所有用户的一些设置 所有用户都有漫游配置文件 我编写了一个 Powershell 脚本 该脚本加载用户的 NTuser dat 的脱机副本并读出特定的密钥 然后该文件被卸载 下一个文件被加载到注册表
  • 旨在打开资源管理器的自定义 URI 协议

    我们有一个为 google chrome 设计的应用程序 我们需要在其中添加网络文件共享的链接 不幸的是 Chrome 否认file protocol出于安全目的 我们想要设置一个自定义协议来允许此功能 我认为做到这一点的一个好方法是调用资
  • 删除注册表键值

    在 MSDN 中 它说在调用更改正在枚举的注册表项的函数时不应使用 RegEnumValue 那么这也适用于删除注册表项值吗 就像这段代码所做的那样 if RegOpenKeyEx m hkey m path c str 0 KEY ALL
  • 在 Mac OS 中使用 JAVA 注册表

    我写了一个Java桌面应用程序在Windows正在使用的平台Windows注册表保存应用程序信息 例如应用程序位置 时间段 例如最多 30 天的免费试用 等 现在 我想创建相同的java应用程序来运行Mac OS 虽然大多数java代码是相
  • 将文件扩展名与程序关联

    我知道怎么做 而且我去过http www codeproject com KB vb VBFileAssociation aspx http www codeproject com KB vb VBFileAssociation aspx前
  • 如何删除注册表中损坏的符号链接

    我正在对注册表进行一些编辑原型 以创建从一个区域到另一个区域的符号链接 我使用了以下代码 HKEY hkFS HKEY hkSOFTWARE DWORD dwDisposition LSTATUS result result RegOpen
  • 在 Windows 注册表中使用 ALIAS 路径时,无法从上下文菜单运行 EXE

    我正在尝试将一个项目添加到 Windows 10 的上下文菜单中 当我使用直接路径时 例如 HKEY CLASSES ROOT Directory Background shell MySetFolders command D DOCS C
  • 无法为 32 位 HKLM 设置注册表插入

    我想在 Inno setup 中创建一个带有子菜单项的上下文菜单 问题是 它在 64 位注册表 WoW6432Node 部分插入 HKLM 密钥 The 文档 http www jrsoftware org ishelp index php
  • 使用cmd获取当前用户路径变量而不使用系统路径

    当我使用标准用户 也是管理员 登录时 命令echo PATH 返回系统路径 用户路径 如何只获取用户的路径 例如 当我当前用户的路径是C ruby C java bin系统路径是 SystemRoot system32 SystemRoot
  • delphi中枚举注册表子项

    我试图根据服务器上安装的 MySQL 版本在客户端计算机上安装驱动程序 为此我想通过注册表项检查服务器上的版本 也就是说 我需要枚举的子项HKEY LOCAL MACHINE SOFTWARE MySQL AB 该键下通常只有一个键 其形式
  • 如何获取 DLL 或 EXE 的文件描述

    我正在创建一个程序 其中之一是控制服务 我正在尝试以类似于中列出的方式列出服务msconfig 下面第一个窗口 我找到了注册表中列出的服务的位置 在 Vista 和 Win7 中 DisplayName 和 Description 通常是引
  • 在 Win 7 上安装 Python 2.7 32 位:没有注册表项?

    我已从 python org 下载了 Python 2 7 2 Windows x86 32 位 MSI 并将其安装在 64 位 Windows 7 系统上 一切正常 至少命令行解释器启动并运行 但安装过程不会创建任何PythonWindo
  • 在 C# 中读取注册表项

    我正在读取注册表项的值 Microsoft Win32 RegistryKey key key someLongPathHere 并将值显示到标签 string a string key GetValue a default value l
  • 如何使用 powershell 以编程方式查找用户 HKEY_USERS 注册表项?

    我想知道如果您知道本地计算机上该用户的登录名 是否有办法在 HKEY USERS 中找到该用户的注册表项 我想以编程方式将内容添加到特定用户的注册表项 例如自动运行 但我只知道用户名 如何确定 HKEY USERS 中的哪些神秘用户实际上属
  • 将注册表中的版本号转换为System.Version?

    我正在从注册表中检索版本号 如下所示 rKey GetValue Version 现在我想将其转换为System Version object 我该怎么做呢 假设这是一个字符串 string versionText string rKey
  • 如何通过MFC将应用程序设置保存到注册表中?

    我有一个由 MFC 项目向导创建的 MFC 应用程序 我想在注册表中保存 读取应用程序设置 所以问了这个question https stackoverflow com questions 1880275 good c registry w
  • 通过注册表将上下文菜单项添加到特定扩展

    首先我们要说的是 我使用的是 Windows 10 并且我看过很多有关此主题的帖子 但似乎没有一个适合我 查看这篇文章已经解决了一些问题 但我仍然需要一些帮助 仅针对特定文件类型将菜单项添加到 Windows 上下文菜单 https sta
  • 从命令提示符/批处理文件添加环境变量

    我正在尝试在批处理文件中添加环境变量 系统 以下命令显示错误 语法无效 有人可以帮忙吗 对我来说它看起来不错 reg add HKLM SYSTEM CurrentControlSet Control Session Manager Env
  • 为什么我的 DLL 无法注册?

    我正在 VS2005 中构建一个项目 但我的几个 DLL 无法注册 我在 Visual Studio 中收到的错误消息是 项目 错误 PRJ0019 工具从 注册 ActiveX 控件 返回错误代码 这很模糊 当我通过命令行手动注册DLL时

随机推荐

  • Fastadmin开源CRM客户管理系统融合开发呼叫中心系统

    基于Fastadmin中开源CRM客户管理系 并支持小程序端UNIapp 统融合开发呼叫中心系统 在crm管理系统中 并实现了来去电弹屏 网页通话等功能 助力企业销售全流程精细化 数字化管理 全面解决企业销售团队的全流程客户服务难题 帮助企
  • 我的第一个半平面交(1007: [HNOI2008]水平可见直线)

    点击打开链接 Description Input 第一行为N 0 lt N lt 50000 接下来的N行输入Ai Bi Output 从小到大输出可见直线的编号 两两中间用空格隔开 Sample Input 3 1 0 1 0 0 0 S
  • Android EditText设置边框

    Android EditText设置边框 简介 Android应用程序中给EditText设置边框 效果图 快速开始 在res drawable目录下新建样式文件 edit background xml
  • iphone彻底删除照片如何恢复_想要从iPhone恢复永久删除的照片,这些方法一定要掌握...

    当你不小心删除了iPhone上的照片 你一定非常伤心难过 因为这些照片都是你生活点滴最好的见证 有你太多的回忆 今天小编将向您展示如何从iPhone恢复已删除的照片 如何在iPhone上还原照片以及防止其再次发生的最佳方法 从iPhone恢
  • 报错:StandardServletMultipartResolver : Failed to perform cleanup of multipart items

    报错 在文件上传接口 解析文件的时候报错 报错信息如下 s w m s StandardServletMultipartResolver Failed to perform cleanup of multipart items java i
  • idea工程在maven projects中显示灰色的解决办法

    在Mac上使用idea进行开发的过程中 一般在MavenProject中包含四个文件如下 1 profile 2 WebMavenTest 工程名 3 WebMavenTestSdk 工程名SDK 4 WebMavenTestService
  • 台式计算机显卡最高温度多少,台式机显卡温度多少是正常的(揭晓显卡正常温度度数)...

    PS 本文只讨论台式机 笔记本与台式机相比性能是偏低的 所以只要保证风扇能正常运转的话 基本上不会出现烧坏的情况 温度多少算正常 要知道电脑的硬件温度是不是过高 首先要了解硬件的正常温度范围 1 CPU 在电脑仅仅保持开机的情况下 一般是3
  • VLC打不开视频文件调试技巧

    用VLC打开TS文件 如果只有视频流的话可以打开 添加进了SRT字幕 打开失败 暴风 QQ影音 KMPlayer都可以正常打开 查询原因 下面是一个VLC自带的查询功能 或按快捷键Ctrl M 打开后的界面如下 注意下面的冗长等级是关键 它
  • 第1章 创建一个html网页

    创建一个html网页 目录标题 1 1认识html 1 2html标签 1 3html文件的基本结构 1 4Chrome的开发者工具 1 5在记事本中编写HTML文件 1 6使用编辑器创建HTML文档 1 6 1下载Hbuilder X 1
  • 位运算符详细解析

    位运算符计算 先把十进制转为二进制 计算完在转回十进制 以下位转换和计算规则 进制和 进制的转换 进制转 进制 标数除以2 若能除尽 该位记做0 若除不尽 该位记做1 再对商继续除以2 以 此类推 直到商为0 然后把每 位的结果反序组合就是
  • ROS语音更改API

    1 准备工作 申请科大讯飞帐号 下载SDK 打开 讯飞官网 创建语音合成需求 下载sdk 其中有libs库 并记录相应的appid 用于后续文件使用 下载的sdk中内容如下 我们将用到libs库中的文件 还需要更改 asr tts 两个文件
  • 【Linux 驱动篇(三)】新字符设备驱动

    文章目录 一 新字符设备驱动原理 1 分配和释放设备号 2 新的字符设备注册方法 2 1 字符设备结构 2 2 cdev init 函数 2 3 cdev add 函数 2 4 cdev del 函数 二 自动创建设备节点 1 mdev 机
  • 从0开始学习JavaScript--初识JavaScript

    一 JavaScript简介 1 JavaScript的起源 avaScript最初由Netscape的Brendan Eich设计 最初将其脚本语言命名为LiveScript 后来Netscape在与Sun合作之后将其改名为JavaScr
  • chatgpt网页版替代方法

    从昨天网上开始一直开着的chatgpt网页突然打不开了 提示1020错误 尝试换了不同代理软件或者代理地点仍然无法解决 也搜了很多资料 比如删除cookie 重启浏览器 更换浏览器等均不起作用 至今仍无法解决 具体错误内容如下 Access
  • 输入yum命令报错:Loaded plugins: fastestmirror You need to be root to perform this command.

    解决方法 是提示要获取root权限 输入su 回车输入密码即可
  • 计算机网络-子网划分(子网地址、广播地址、子网掩码)

    子网划分 题目 办公室内有一台计算机 IP地址为192 45 165 243 子网掩码为255 255 255 224 则该机所在的网络属于哪类网络 其网络是否进行了子网划分 若划分 则分为几个网络 并写出每个子网号 改机的子网号和广播地址
  • LFU算法族:window-LFU

    LFU算法族相关文章目录汇总 LFU算法 LFU Aging算法 window LFU算法 本文 1 LFU算法的不足 LFU Least Frequently Used 是一种缓存淘汰算法 LFU算法是根据缓存的访问频率 去淘汰访问次数最
  • JS程序

    注 题目来源 力扣 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 解题思路 这个题目是直接拍脑袋想法 就是暴力求解 思路是这
  • c++ cin整数以,(逗号)分割读取

    1 某些场景整数流不是空格分割 如用逗号分割 例如 下面的输入 要求每行是一个数组 一共两行测试输入 1 2 3 4 5 6 7 8 下面的代码就可以很好的解决问题 vector
  • C# 系统应用之注册表使用详解

    在平时做项目时 我们有时会遇到注册表的操作 例如前面我们需要获取IE浏览器地址栏的信息 获取 我的电脑 地址栏输入的文件夹信息 USB最近使用信息等 注册表项是注册表的基本组织单位 它包含子表项和值条目 简言之 注册表项相当于注册表里的文件