zoukankan      html  css  js  c++  java
  • windows注册表

    一、历史

    Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.da0和user.da0。通过Windows目录下的regedit.exe程序可以存取注册表数据库。在以前,在windows的更早版本(在Win95以前),这些功能是靠win.ini,system.ini和其他与应用程序有关联的.ini文件来实现的。

    在windows操作系统家族中,system.ini和win.ini这两个文件包含了操作系统所有的控制功能和应用程序的信息,system.ini管理计算机硬件而win.ini管理桌面和应用程序。所有驱动、字体、设置和参数会保存在.ini文件中,任何新程序都会被记录在.ini文件中。这些记录会在程序代码中被引用。因为受win.ini和system.ini文件大小的限制,程序员添加辅助的.INI文件以用来控制更多的应用程序。举例来说,微软的Excel有一个office excel.ini文件,它包含着选项、设置、缺省参数和其他关系到Excel运行正常的信息。在system.ini和win.ini中只需要指出excel.ini的路径和文件名即可。

    早在Dos和Win3.x的时代,大部分的应用程序都是采用了 ini 文件(初始化文件)来保存一些配置信息,如设置路径,环境变量等。system.ini和win.ini控制着所有windows和应用程序的特征和存取方法,它在少数的用户和少数应用程序的环境中工作的很好。随着应用程序的数量和复杂性越来越大,则需要在.ini文件中添加更多的参数项。

    这样下来,在一个变化的环境中,在应用程序安装到系统中后,每个人都会更改.ini文件。然而,没有一个人在删除应用程序后删除.ini文件中的相关设置,所以system.ini和win.ini这个两个文件会变的越来越大。每增加的内容会导致系统性能越来越慢。而且每次应用程序的升级都出现这样的难题:升级会增加更多的参数项但是从来不去掉旧的设置。而且还有一个明显的问题,一个.ini文件的最大尺寸是64KB。为了解决这个问题,软件商自己开始支持自己的.ini文件,然后指向特定的ini文件如win.ini和system.ini文件。这样下来多个.ini文件影响了系统正常的存取级别设置。如果一个应用程序的.ini文件和WIN.INI文件设置起冲突,究竟是谁的优先级更高呢?

    注册表最初被设计为一个应用程序的数据文件相关参考文件,最后扩展成对于32位操作系统和应用程序包括了所有功能下的东东。注册表是一套控制操作系统外表和如何响应外来事件工作的文件。这些“事件”的范围从直接存取一个硬件设备到接口如何响应特定用户到应用程序如何运行等等。注册表因为它的目的和性质变的很复杂,它被设计为专门为32位应用程序工作,文件的大小被限制在大约40MB。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施,软件配置等信息,从而方便了管理,增强了系统的稳定性。最直观的一个实例就是,为什么windows下的不同用户可以拥有各自的个性化设置,如不同的墙纸,不同的桌面。这就是通过注册表来实现的。

    由此可见,注册表(Registry)是Windows9x/Me/NT/2000操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”;是一个巨大的树状分层的数据库。它记录了用户安装在机器上的软件和每个程序的相互关联关系;它包含了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据等。

    二、注册表的作用

    注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。16位驱动在Windows NT下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS来控制的。在Win9x下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win9x 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。

    在没有注册表的情况下,操作系统不会获得必须的信息来运行和控制附属的设备和应用程序及正确响应用户的输入。

    在系统中注册表是一个记录32位驱动的设置和位置的数据库。当操作系统需要存取硬件设备,它使用驱动程序,甚至设备是一个BIOS支持的设备。无BIOS支持的设备安装时必须需要驱动,这个驱动是独立于操作系统的,但是操作系统需要知道从哪里找到它们,文件名、版本号、其他设置和信息,没有注册表对设备的记录,它们就不能被使用。

    当一个用户准备运行一个应用程序,注册表提供应用程序信息给操作系统,这样应用程序可以被找到,正确数据文件的位置被规定,其他设置也都可以被使用。

    注册表保存关于缺省数据和辅助文件的位置信息、菜单、按钮条、窗口状态和其他可选项。它同样也保存了安装信息(比如说日期),安装软件的用户,软件版本号和日期,序列号等。根据安装软件的不同,它包括的信息也不同。

    然而,一般来说,注册表控制所有32位应用程序和驱动,控制的方法是基于用户和计算机的,而不依赖于应用程序或驱动,每个注册表的参数项控制了一个用户的功能或者计算机功能。用户功能可能包括了桌面外观和用户目录。所以,计算机功能和安装的硬件和软件有关,对所以用户来说项都是公用的。

    有些程序功能对用户有影响,有些时作用于计算机而不是为个人设置的,同样的,驱动可能是用户指定的,但在很多时候,它们在计算机中是通用的。

    三、注册表的结构

    WINDOWS的注册表有六大根键,相当于一个硬盘被分成了六个分区。
    在“运行”对话框中输入RegEdit,然后单击“确定”按钮,则可以运行注册表编辑器。
    Windows 98中文版的注册表Registry(System.dat、User.dat、Config.pol)的数据组织结构。

    注册表的根键共六个。这些根键都是大写的,并以HKEY_为前缀。这种命令约定是以Win32 API的Registry函数的关键字的符号变量为基础的。
    注册表就是一颗大树,树的叶子节点包含三项:名称-类型-值。
    数据类型有六种:字符串值,二进制值,32位值,64位值,多字符串值,可扩充字符串值。
    根键:系统定义的配置单元,通过"HKEY_"来表示。

    • HKEY_CLASSES_ROOT:定义了系统中所有已经注册的文件扩展名、文件类型、文件图标等。
    • HKEY_CURRENT_USER:定义了当前用户的所有权限,实际上就是HKEY_USER.Defalut下面的一部分内容,包含了当前用户的登录信息。
    • HKEY_LOCAL_MACHINE:定义了本地计算机(相对网络环境而言)的软硬件的全部信息。当系统的配置和设置发生变化时,其下面的登录项也会随之改变
    • HKEY_USER:定义了所有的用户信息,其中部分分支将映射到HKEY_CURRNET_USRE关键字中,它的大部分设置都可以通过控制面板来修改。
    • HKEY_CURRENT_CONFIG:定义了计算机的当前配置情况,如显示器、打印机等可选外设及其设置信息等。实际上也是指向HKEY_LOCAL_MACHINEConfig结构中的某个分支的指针。

    虽然在注册表中,六个根键看上去处于一种并列的地位,彼此毫无关系。但事实上,HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG中存放的信息都是HKEY_LOCAL_MACHINE中存放的信息的一部分,而HKEY_CURRENT_USER中存放的信息只是HKEY_USERS存放的信息的一部分。

    HKEY_LOCAL_MACHINE包括HKEY_CLASSES_ROOT和HKEY_CURRENT_USER中所有的信息。在每次系统启动后,系统就映射出HKEY_CURRENT_USER中的信息,使得用户可以查看和编辑其中的信息。

    实际上,HKEY_LOCAL_MACHINESOFTWAREClasses就是HKEY_CLASSES_ROOT,为了用户便于查看和编辑,系统专门把它作为一个根键。同理,HKEY_CURRENT_CONFIGSY-STEMCurrent Control就是HKEY_LOCAL_MACHINESYSTEMCurrent Control。

    HKEY_USERS中保存了默认用户和当前登录用户的用户信息。HKEY_CURRENT_USER中保存了当前登录用户的用户信息。

    HKEY_DYN_DATA保存了系统运行时的动态数据,它反映出系统的当前状态,在每次运行时都是不一样的,即便是在同一台机器上。

    根据上面的分析,注册表中的信息可以分为HKEY_LOCAL_MACHINE和HKEY_USERS两大类,这两大类的详细内容请看后面的介绍。

    四、六大根键的作用

    在注册表中,所有的数据都是通过一种树状结构以键和子键的方式组织起来,十分类似于目录结构。每个键都包含了一组特定的信息,每个键的键名都是 和它所包含的信息相关的。如果这个键包含子键,则在注册表编辑器窗口中代表这个键的文件夹的左边将有“+”符号,以表示在这个文件夹中有更多的内容。如果这个文件夹被用户打开了,那么这个“+”就会变成“-”。

    1.HKEY_USERS

    该根键保存了存放在本地计算机口令列表中的用户标识和密码列表。每个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。

    2.HKEY_CURRENT_USER

    该根键包含本地工作站中存放的当前登录的用户信息,包括用户登录用户名和暂存的密码(注:此密码在输入时是隐藏的)。用户登录Windows 98时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。

    3.HKEY_CURRENT_CONFIG

    该根键存放着定义当前用户桌面配置(如显示器等)的数据,最后使用的文档列表(MRU)和其他有关当前用户的Windows 98中文版的安装的信息。

    4.HKEY_CLASSES_ROOT

    根据在Windows 98中文版中安装的应用程序的扩展名,该根键指明其文件类型的名称。
    在第一次安装Windows 98中文版时,RTF(Rich Text format)文件与写字板(WordPad)&127;联系起来,但在以后安装了中文Word 6.0后,双击一个RTF文件时,将自动激活Word。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT,将替代WIN.INI文件中的设置项,它把应用程序与文件扩展名联系起来,它也替代了Windows 3.x中的Reg.dat文件中的相似的设置项。

    5.HKEY_LOCAL_MACHINE

    该根键存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问的一组键中。
    该根键中的许多子键与System.ini文件中设置项类似。

    6.HKEY_DYN_DATA

    该根键存放了系统在运行时动态数据,此数据在每次显示时都是变化的,因此,此根键下的信息没有放在注册表中。

    五、注册表常用Key

    注册表是一个大型数据库Registry。要详细地分析该数据库,不是一两页就能介绍完。我曾经用了半年多时间分析此数据库结构。下面只介绍部分重要内容。

    HKEY_CLASS_ROOT

    HKEY_CLASS_ROOT/Paint.Pricture/DefaultIcon双击窗口右侧的默认字符串,在打开的对话框中删除原来的“键值”,输入%1。重新启动后,在“我的电脑”中打开Windows目录,选择“大图标”,然后你看到的Bmp文件的图标再也不是千篇一律的MSPAINT图标了,而是每个Bmp文件的略图(前提是未安装ACDSee等看图软件)。

    HKEY_CURRENT_USER

    1.HKEY_CURRENT_USERControl PanelDesktop 中新建串值名MenuShowDelay=0 可使“开始”菜单中子菜单的弹出速度提高。

    2.在HKEY_CURRENT_USERControl PanelDeskt-opWindowsMeterics中新建串值名MinAnimate,值为1启动动画效果开关窗口,值为0取消动画效果。

    HKEY_LOCAL_MACHINE

    1.HKEY_LOCAL_MACHINEsoftwaremicrosoftwindowscurrentVersionexploreruser shell folders 保存个人文件夹、收藏夹的路径。
    2.HKEY_LOCAL_MACHINEsystemcurrentControl-Setcontrolkeyboard Layouts 保存键盘使用的语言以及各种中文输入法。
    3.HKEY_LOCAL_MACHINEsoftwaremicrosoftwindowscurrentVersionuninstall 保存已安装的Windows应用程序卸载信息。
    4.HKEY_LOCAL_MACHINEsystemCurrentControl-Setservicesclass 保存控制面板-增添硬件设备-设备类型目录。
    5.HKEY_LOCAL_MACHINEsystemCurrent-ControlSetcontrolupdate 设置刷新方式。值为00设置为自动刷新,01设置为手工刷新。
    6.HKEY_LOCAL_MACHINEsoftwaremicrosoftwin-dowscurrentVersion un 保存由控制面板设定的计算机启动时运行程序的名称,其图标显示在任务条右边。在“启动”文件夹程序运行时图标也在任务条右边。
    7.HKEY_LOCAL_MACHINEsoftwaremicrosoftwindowscurrentVersionPoliciesRatings 保存IE4.0中文版“安全”“分级审查”中设置的口令(数据加密),若遗忘了口令,删除 Ratings 中的数据即可解决问题。
    8.HKEY_LOCAL_MACHINEsoftwaremicrosoftwindowscurrentVersionexplorerdesktop ameSpace 保存桌面中特殊的图标,如回收站、收件箱、MS Network等。

    HKEY_USERS

    1.HKEY_USERS.Defaultsoftwaremicrosoftinternet explorer ypeURLs保存IE4.0浏览器地址栏中输入的URL地址列表信息。清除文档菜单时将被清空。
    2.HKEY_USERS.Defaultso..mi..wi..current-Versionex..menuOrderstartMenu保留程序菜单排序信息。
    3.HKEY_USERS.Defaultso..microsoftwindowscurrent-VersionexplorerRunMRU保存“开始 运行...”中运行的程序列表信息。清除文档菜单时将被清空。
    4.HKEY_USERS.Defaultso..microsoftwindowscurrent-VersionexplorerRecentDocs 保存最近使用的十五个文档的快捷方式(删除掉可解决文档名称重复的毛病),清除文档菜单时将被清空。
    5.HKEY_USERS.defaultsoftwaremicrosoftwindowscurrentVersionapplets 保存Windows应用程序的记录数据。
    6.HKEY_USERS.defaultsoftwaremicrosoftwindowscurrentVersion un保存由用户设定的计算机启动时运行程序的名称,其图标显示在任务条右侧。

    六、注册表术语

    ①、注册表:是一个树状分层的数据库。从物理上讲,它是System.dat和User.dat两个文件;从逻辑上讲,它是用户在注册表编辑器中看到的配置数据。
    ②、HKEY :“根键”或“主键”,它的图标与资源管理器中文件夹的图标有点儿相像。Windows98将注册表分为六个部分,并称之为 HKEY_name,它意味着某一键的句柄。
    ③、key(键):它包含了附加的文件夹和一个或多个值。
    ④、subkey(子键):在某一个键(父键)下面出现的键(子键)。
    ⑤、branch(分支):代表一个特定的子键及其所包含的一切。一个分支可以从每个注册表的顶端开始,但通常用以说明一个键和其所有内容。
    ⑥、value entry(值项):带有一个名称和一个值的有序值。每个键都可包含任何数量的值项。每个值项均由三部分组成:名称,数据类型,数据。

      ★ 名称:不包括反斜杠的字符、数字、代表符、空格的任意组合。同一键中不可有相同的名称。

      ★ 数据类型:包括字符串、二进制、双字三种。

      字符串(REG_SZ):顾名思义,一串ASCII码字符。如“Hello World”,是一串文字或词组。在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成。注册表总是在引号内显示字符串。

      二进制(REG_BINARY):如 F03D990000BC ,是没有长度限制的二进制数值,在注册表编辑器中,二进制数据以十六进制的方式显示出来。

      双 字(REG_DWORD):从字面上理解应该是Double Word ,双字节值。由1-8个十六进制数据组成,我们可用以十六进制或十进制的方式来编辑。如 D1234567 。

      ★ 数据: 值项的具体值,它可以占用到64KB。

    ⑦、 Default(缺省值):每一个键至少包括一个值项,称为缺省值(Default),它总是一个字串。

    八、注册表清理脚本

    以下代码主要是删除临时文件,旧文件。并不能够删除无效的键

    @echo off 
    del/f/s/q %systemdrive%*.tmp 
    del/f/s/q %systemdrive%*._mp 
    del/f/s/q %systemdrive%*.log 
    del/f/s/q %systemdrive%*.gid 
    del/f/s/q %systemdrive%*.chk 
    del/f/s/q %systemdrive%*.old 
    del/f/s/q %windir%*.bak 
    del/f/q %systemdrive%
    ecycled*.* 
    del/f/q %windir%prefetch*.* 
    rd/s/q %windir%	emp & md %windir%	empemp% &md %temp% 
    del/f/q %userprofile%cookies*.* 
    del/f/q %userprofile%
    ecent*.* 
    rd/s/q “%userprofile%Local SettingsTemporary Internet Files” 
    cls & echo 系统垃圾清除完成:) 
    echo. & pause
    

    九、类似regedit的程序

    regedit=regist(注册)+edit(编辑)

    1. gpedit.msc-----组策略
    2. sndrec32-------录音机
    3. Nslookup-------IP地址侦测器
    4. explorer-------打开资源管理器
    5. logoff---------注销命令
    6. tsshutdn-------60秒倒计时关机命令
    7. lusrmgr.msc----本机用户和组
    8. services.msc---本地服务设置
    9. oobe/msoobe /a----检查XP是否激活
    10. notepad--------打开记事本
    11. cleanmgr-------垃圾整理
    12. net start messenger----开始信使服务
    13. compmgmt.msc---计算机管理
    14. net stop messenger-----停止信使服务
    15. conf-----------启动netmeeting
    16. dvdplay--------DVD播放器
    17. charmap--------启动字符映射表
    18. diskmgmt.msc---磁盘管理实用程序
    19. calc-----------启动计算器
    20. dfrg.msc-------磁盘碎片整理程序
    21. chkdsk.exe-----Chkdsk磁盘检查
    22. devmgmt.msc--- 设备管理器
    23. regsvr32 /u *.dll----停止dll文件运行
    24. drwtsn32------ 系统医生
    25. rononce -p ----15秒关机
    26. dxdiag---------检查DirectX信息
    27. regedt32-------注册表编辑器
    28. Msconfig.exe---系统配置实用程序
    29. rsop.msc-------组策略结果集
    30. mem.exe--------显示内存使用情况
    31. regedit.exe----注册表
    32. winchat--------XP自带局域网聊天
    33. progman--------程序管理器
    34. winmsd---------系统信息
    35. perfmon.msc----计算机性能监测程序
    36. winver---------检查Windows版本
    37. sfc /scannow-----扫描错误并复原
    38. taskmgr-----任务管理器(2000/xp/2003
    39. winver---------检查Windows版本
    40. wmimgmt.msc----打开windows管理体系结构(WMI)
    41. wupdmgr--------windows更新程序
    42. wscript--------windows脚本宿主设置
    43. write----------写字板
    44. winmsd---------系统信息
    45. wiaacmgr-------扫描仪和照相机向导
    46. winchat--------XP自带局域网聊天
    47. mem.exe--------显示内存使用情况
    48. Msconfig.exe---系统配置实用程序
    49. mplayer2-------简易widnows media player
    50. mspaint--------画图板
    51. mstsc----------远程桌面连接
    52. mplayer2-------媒体播放机
    53. magnify--------放大镜实用程序
    54. mmc------------打开控制台
    55. mobsync--------同步命令
    56. dxdiag---------检查DirectX信息
    57. drwtsn32------ 系统医生
    58. devmgmt.msc--- 设备管理器
    59. dfrg.msc-------磁盘碎片整理程序
    60. diskmgmt.msc---磁盘管理实用程序
    61. dcomcnfg-------打开系统组件服务
    62. ddeshare-------打开DDE共享设置
    63. dvdplay--------DVD播放器
    64. net stop messenger-----停止信使服务
    65. net start messenger----开始信使服务
    66. notepad--------打开记事本
    67. nslookup-------网络管理的工具向导
    68. ntbackup-------系统备份和还原
    69. narrator-------屏幕"讲述人"
    70. ntmsmgr.msc----移动存储管理器
    71. ntmsoprq.msc---移动存储管理员操作请求
    72. netstat -an----(TC)命令检查接口
    73. syncapp--------创建一个公文包
    74. sysedit--------系统配置编辑器
    75. sigverif-------文件签名验证程序
    76. sndrec32-------录音机
    77. shrpubw--------创建共享文件夹
    78. secpol.msc-----本地安全策略
    79. syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
    80. services.msc---本地服务设置
    81. Sndvol32-------音量控制程序
    82. sfc.exe--------系统文件检查器
    83. sfc /scannow---windows文件保护
    84. tsshutdn-------60秒倒计时关机命令
    85. tourstart------xp简介(安装完成后出现的漫游xp程序)
    86. taskmgr--------任务管理器
    87. eventvwr-------事件查看器
    88. eudcedit-------造字程序
    89. explorer-------打开资源管理器
    90. packager-------对象包装程序
    91. perfmon.msc----计算机性能监测程序
    92. progman--------程序管理器
    93. regedit.exe----注册表
    94. rsop.msc-------组策略结果集
    95. regedt32-------注册表编辑器
    96. rononce -p ----15秒关机
    97. regsvr32 /u *.dll----停止dll文件运行
    98. regsvr32 /u zipfldr.dll------取消ZIP支持
    99. cmd.exe--------CMD命令提示符
    100. chkdsk.exe-----Chkdsk磁盘检查
    101. certmgr.msc----证书管理实用程序
    102. calc-----------启动计算器
    103. charmap--------启动字符映射表
    104. cliconfg-------SQL SERVER 客户端网络实用程序
    105. Clipbrd--------剪贴板查看器
    106. conf-----------启动netmeeting
    107. compmgmt.msc---计算机管理
    108. cleanmgr-------垃圾整理
    109. ciadv.msc------索引服务程序
    110. osk------------打开屏幕键盘
    111. odbcad32-------ODBC数据源管理器
    112. oobe/msoobe /a----检查XP是否激活
    113. lusrmgr.msc----本机用户和组
    114. logoff---------注销命令
    115. iexpress-------木马捆绑工具,系统自带
    116. Nslookup-------IP地址侦测器
    117. fsmgmt.msc-----共享文件夹管理器
    118. utilman--------辅助工具管理器
    119. gpedit.msc-----组策略

    十、更改注册表的例子

    文件夹上下文菜单修改

    修改HKEY_CLASSES_ROOT项的Directory项,background表示在文件夹中点击鼠标右键出现的上下文菜单;shell表示选中文件夹之后鼠标右键出现的上下文菜单;shellex表示按住shift时可以看见的上下文菜单,比如“复制文件路径”命令就必须在按住shift的时候点击鼠标右键才能显示出来。
    这个shell/command,其实就是写一个脚本,文件夹的完全路径名称为第一个参数: %1。也可以模仿cmd命令写成%V。

    右键文件夹时显示复制到剪贴板

    文件夹路径复制到剪贴板

    一种方式是直接打开regedit修改,另一种方式是把键值对写成如下形式,保存为haha.reg文件,双击运行即可。

    [HKEY_CLASSES_ROOTDirectoryshellcopypath]  
    @="复制文件夹路径"  
    [HKEY_CLASSES_ROOTDirectoryshellcopypathcommand]  
    @="mshta vbscript:clipboarddata.setdata("text","%1")(close)"
    

    将sublime添加到上下文菜单中

    将sublime命令加入到上下文菜单中去。步骤如下:
    1、新建HKEY_CLASSES_ROOTDirectoryshellsublime项,可以给这一项指定注册表名称(sublime)、显示名称(在sublime打开)、图标(显示的图标)
    2、在sublime项下新建一项command表示点击这一项之后发生的事件。%1表示命令的第一个参数,%*表示命令全部参数。有时候用%1不管用,可以试试%V。

    添加“新建”到上下文菜单

    运行杀毒软件时,可能把上下文菜单中的“新建”去掉。可以通过添加HKEY_CLASSES_ROOTDirectoryShareExContextMenuHandlers ew={D969A300-E7FF-11d0-A93B-00A0C90F2719}来找回。

    十一、使用C#操作注册表

    下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:

    • 注册表项的创建,打开与删除
    • 键值的创建(设置值、修改),读取和删除
    • 判断注册表项是否存在、判断键值是否存在。

    和注册表相关的命名空间using Microsoft.Win32;,在这个命名空间里面包含了许多注册表相关的类。命名空间里面提供了一个类RegistryKey 利用它我们可以定位到注册表最开头的分支:ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig,如:RegistryKey key = Registry.LocalMachine;。在操作的过程中涉及到子分支,要用\进行深入。最后要调用RegistryKey对象的Close()关闭注册表。

    以下我们的例子都是在LocalMachine分支下,请注意。

    注册表项的创建,打开与删除

    1:创建
    创建注册表项主要用到RegistryKey 的CreateSubKey()方法。如:

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.CreateSubKey("software\test");
    //在HKEY_LOCAL_MACHINESOFTWARE下新建名为test的注册表项。如果已经存在则不影响!
    

    2:打开
    打开注册表项主要用到RegistryKey 的OpenSubKey()方法。如:
    注意,如果该注册表项不存在,这调用这个方法会抛出异常

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\test",true);
    //注意该方法后面还可以有一个布尔型的参数,true表示可以写入。
    

    3:删除
    删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。如:

    RegistryKey key = Registry.LocalMachine;
    key.DeleteSubKey("software\test",true); //该方法无返回值,直接调用即可
    key.Close();
    

    注意,如果该注册表项不存在,这调用这个方法会抛出异常

    键值的创建、读取和删除

    1:创建(设置值、修改)
    对键值的创建修改等操作主要用到RegistryKey 的SetValue()方法

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("software\test",true); //该项必须已存在
    software.SetValue("test", "博客园");
    //在HKEY_LOCAL_MACHINESOFTWARE	est下创建一个名为“test”,值为“博客园”的键值。如果该键值原本已经存在,则会修改替换原来的键值,如果不存在则是创建该键值。
    // 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如:
    // software.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息
    Key.Close();
    

    2:读取

    string info = "";
    RegistryKey Key;
    Key = Registry.LocalMachine;
    myreg = Key.OpenSubKey("software\test");
    // myreg = Key.OpenSubKey("software\test",true);
    info = myreg.GetValue("test").ToString();
    myreg.Close();
    info结果为:博客园
    

    3:删除

    RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\test", true);
    delKey.DeleteValue("test");
    delKey.Close();
    

    细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其他例子的不同。
    如果你要修改键值,包括创建、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;如果仅仅只是读取键值可以不加,此时可写关闭,你不能再往里写值(当然,你要加也可以true)!
    还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操作。
    如:

    software.SetValue("", "博客园"); // 在HKEY_LOCAL_MACHINESOFTWARE	est修改默认键值的值为“博客园”。读取类似!
    

    另外,默认的键值是不能删除的,所以不要用DeleteValue()方法去删除,会抛出异常的!

    判断注册表项是否存在

    private bool IsRegeditItemExist()  
    {  
        string [] subkeyNames;  
        RegistryKey hkml = Registry.LocalMachine;  
        RegistryKey software = hkml.OpenSubKey("SOFTWARE");  
        //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);  
        subkeyNames = software.GetSubKeyNames();  
        //取得该项下所有子项的名称的序列,并传递给预定的数组中  
        foreach (string keyName in subkeyNames)   
        //遍历整个数组  
        {  
            if (keyName == "test")  
            //判断子项的名称  
            {   
                hkml.Close();  
                return true ;  
            }  
        }  
        hkml.Close();  
        return false;   
    }
    

    判断键值是否存在

    private bool IsRegeditKeyExit()
    {
      string[] subkeyNames;
      RegistryKey hkml = Registry.LocalMachine;
      RegistryKey software = hkml.OpenSubKey("SOFTWARE\test");
      //RegistryKey software = hkml.OpenSubKey("SOFTWARE\test", true);
      subkeyNames = software.GetValueNames();
      //取得该项下所有键值的名称的序列,并传递给预定的数组中
      foreach (string keyName  in subkeyNames)
      {
        if (keyName ==  "test") //判断键值的名称
        {
            hkml.Close();
            return true;
        }    
        
      }
      hkml.Close();
      return false;
    }
    

    参考资料

    http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-regidit.html
    http://www.jb51.net/article/3328.htm

  • 相关阅读:
    模块和包
    mysql视图、存储过程等
    mysql 索引
    sql语句
    HTTP协议
    Django中的form组件
    数据结构
    一些常用函数
    C/C++中tag和type
    什么是compile-time-constant
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/10961872.html
Copyright © 2011-2022 走看看