在平时做项目时,我们有时会遇到注册表的操作,例如前面我们需要获取ie浏览器地址栏的信息、获取"我的电脑"地址栏输入的文件夹信息、usb最近使用信息等.注册表项是注册表的基本组织单位,它包含子表项和值条目.简言之,注册表项相当于注册表里的文件夹.它们存储计算机安装程序的信息,如颜色设置、屏幕大小、历史记录等.
举个以前使用注册表最多的例子:当我们玩魔兽或dota时,总需要打开"运行"->输入"regedit"打开注册表,在hkey_current_user->software->blizzard entertainment->warcraft iii->video中修改reswidth(屏幕宽)和resheight(屏幕高).使其屏幕分辩率与游戏一致全屏显示.
下面就详细讲解注册表的使用.
一.注册表的结构
注册表(registry)是windows系统中一个重要的数据库,它用于存储有关应用程序、用户和系统信息.注册表的结构就像一颗树.树的顶级节点(hive)不能添加、修改和删除.
如下图所示是windows注册表的顶级节点:
在c#中对注册表进行操作,需要引用命名空间:using microsoft.win32.
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()方法创建.
例如在hkey_current_user下创建键eastmount和hkey_current_user\software\eastmount\test2.其中我们最常用的是在\software这个键下创建程序产品键,保存一些程序的配置在注册表中.如果software中没有eastmount键,则会先创建这个键及其子键.如果存在就不会重写.
注意:c#字符串中反斜杠是转义字符,前面加前缀@时,告诉字符串按字面值处理而不进行转义.@"software\eastmount\test2"="software\\eastmount\\test2".
运行结果如下:
2.打开子键
3.删除注册表的键
删除注册表的键有两个方法: deletesubkey()和deletesubkeytree().deletesubkey()删除不包括子键的键及其所有值,deletesubkeytree()不仅删除键及其值,还删除键下所有子键(慎用该方法).
如果键不存在,会有异常错误提示,最好使用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.
例如获取hkey_current_user\environment中的path键值.
registrykey.getvalue方法可以检索与指定名称关联的值.函数原型public object getvalue(string name).其中参数name表示键的名称.如程序中我获取计算机地址栏输入的信息.
运行结果如下图所示.其实还可以获取很多东西,usb使用信息、浏览器使用信息、软件路径等等.
5.创建和设置键值
registry.setvalue()方法设置指定的注册表项的指定名称/值对,如果指定的项不存在,则创建该项.
注意:每次调用setvalue方法时,它都打开一个注册表项,设置其值,然后关闭该项.如果需要大批量修改建议使用registrykey.setvalue方法.public object setvalue(string name,object value).
ps:举个简单的例子通过设置我的电脑-{20d04fe0-3aea-1069-a2d8-08002b30309d}为1,即可隐藏桌面我的电脑图标.修改为0又可以显示,你知不知道把文件夹添加".{20d04fe0-3aea-1069-a2d8-08002b30309d}"后就变成了"我的电脑",可以用来隐藏文件.
最后希望文章对大家有所帮助,文章主要是自己这段时间对c#调用注册表信息的总结,一方面讲述了注册表相关的基础知识,另一方面通过代码结合图片格式讲述简单运用注册表.同时如果文章中有什么啰嗦或不足之处,还请海涵.