C#与注册表.docx
- 文档编号:10599035
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:20
- 大小:22.47KB
C#与注册表.docx
《C#与注册表.docx》由会员分享,可在线阅读,更多相关《C#与注册表.docx(20页珍藏版)》请在冰豆网上搜索。
C#与注册表
★
注册表基础知识
1.1什么是注册表
注册表并不神秘,简单地说,它是用来对Windows操作系统进行配置的一个工具。
通过它,可以对操作系统及应用软件进行优化,并可自己设置Windows的使用权根及解决硬件及网络设置不当带来的故障,甚至可以改造自己的操作系统。
在Windows3.x操作系统中,注册表是一个名为Reg.dat的文件,里面存储了一些文件关联的信息。
操作系统大部分的设置都存放在系统配置文件(INI文件)中,由于这些INI文件不便于管理和维护,经常出现一些因INI文件遭到破坏而导致系统无法启动的问题,而且在Windows95以上版本的操作系统中,需要保存的信息的数量和类型已经远远超过了INI文件的能力。
为了使系统运行的更加稳定和健壮,同时也为了满足不断提高的信息保存要求,Microsoft将注册表技术引入了操作系统中,同时将INI文件中的大部分设置也移植到注册表中。
目前,注册表在操作系统的启动和运行过程中起着十分重要的作用。
注册表(Registry)是关于系统设置的层次式数据库,它记录了用户账号、服务器硬件以及应用程序的设置信息等。
和INI文件相比,注册表可以控制的数据要多得多,而且不仅仅限于处理字符串类型的数据。
注册表也包含了一些系统配置的信息,这些信息根据操作系统的不同而不同。
注册表为系统和应用程序提供了保存其配置参数的最佳场所,对于注册表的访问和操作是十分必要的。
注册表是Windows操作系统的核心部分,因此,在访问和操作注册表时应十分小心,以免破坏操作系统。
1.2注册表的结构
在Windows操作系统中提供了注册表编辑程序。
在安装了Windows后,注册表编辑程序被复制到Windows操作系统所在目录。
注册表编辑程序名称为regedit.exe(其中,WindowsNT中的注册表编辑程序名称为regedt32.exe)。
运行注册表编辑程序的步骤如下:
(1)单击Windows系统“开始”按钮,在弹出的菜单中选择“运行”命令,打开“运行”对话框。
(2)在“打开”下拉列表框中输入regedit.exe(或者regedit)。
(3)单击“确定”按钮,即可打开注册表编辑器。
另一种方法是在Windows操作系统的安装目录下找到regedit.exe文件,双击即可运行注册表编辑程序。
1.注册表中各主键的作用
注册表中的所有信息都是分类保存的,“主键”是各个大的信息分类名称。
注册表中的所有信息均被分类存放在相应主键中。
操作系统不同相应的主键也不相同,其中,Windows9x、WindowsNT、Windowsme操作系统中有6个主键,而Windows2000、Windows2003操作系统中则有5个主键。
主键将注册表中的数据分为6大类,每一类都保存了不同的信息。
(1)HKEY_CLASSES_ROOT主键
该主键用于保存在系统中注册的各类文件的控制名以及文件关联等信息,例如文件扩展名、图标、文件启动模式、对象类型名称、对象类型ID等。
这个主键下的文件扩展名有两类,一类是系统事先约定的扩展名,另一类是应用程序或用户自定义的文件扩展名。
例如将扩展名为.ace说明为由WinRAR处理的文件,则在HKEY_CLASSES_ROOT的.ace子键的数据项中将数值设为“WinRAR”。
事实上,该主键是一个冗余项,因为该主键下的所有信息都可以在HEKY_LOCAL_MACHINE主键中的\Software\Class子键中找到。
(2)HKEY_CURRENT_USER主键
该主键用于保存登录到系统的当前用户的计算机的环境变量、桌面设置、应用程序设置、个人程序组、打印机和网络连接等信息。
该主键比HKEY_USERS主键更具体,HKEY_USERS主键包含所有登录用户的用户环境文件。
(3)HEKY_LOCAL_MACHINE主键
这是注册表中一个极为重要的主键,在这个主键中保存了计算机的硬件、软件及操作系统的配置信息,例如硬件组态、外部设备、网络设备、软件的安装及设置等。
在该主键中可以找到与系统有关的有价值的信息,在使用注册表时,大部分操作都是针对该主键的。
(4)HKEY_USERS主键
该主键用于保存计算机所有用户的配置信息。
HKEY_USERS主键包含了计算机中的所有用户,而HKEY_CURRENT_USER主键只包含当前登录到计算机的用户的信息。
由此,HKEY_CURRENT_USER主键是HKEY_USERS主键的一部分。
(5)HKEY_CURRENT_CONFIG主键
该主键用于存放计算机当前的硬件配置信息,此根键实际上是HEKY_LOCAL_MACHINE中的一部分,它的子键与HKDY_LOCAL_MACHINE\Config\0001分支下的数据完全一样。
(6)HKEY_PERFORMANCE_DATA
在windowsNT/2000/XP注册表中虽然没有HKEY_DYN_DATA键,但是它却隐藏了一个名为“HKEY_PERFORMANCE_DATA”的键。
所有系统中的动态信息都存放在此子键中。
系统自带的注册表编辑器无法看到此键,但可以用专门的程序来查看此键,例如使用性能监视器。
2.主键、子键及键值
单击主键左端的“+”号,即可将该主键展开,展开后即可看到该主键下的所有子键,每一个项展开后还可以列出下一级的项,这些项称为“子键”(也称为子项)。
每一个主键及相应的子键都可以称为键(也可称为项)。
主键、子键以及键的关系。
从图37.3中可以看出注册表编辑器窗口分为左右两个部分,如果在左边窗格中选择一个键或者子键,则在右边窗格中将显示这个键或子键的值。
一个值由“名称”、“类型”和“数据”三部分组成。
注意:
子键名不是注册表独有的,而且同一子键名可能出现在几个不同的地方。
3.主键所对应的常数
Windows操作系统注册表中的主键名称和对应常数如表所示。
表注册表的主键名称和对应常数
主键名称
常数
HKEY_CLASSES_ROOT
H80000000
HKEY_CURRENT_USER
H80000001
HKEY_LOCAL_MACHINE
H80000002
HKEY_USERS
H80000003
HKEY_CURRENT_CONFIG
H80000005
说明:
在Windows98操作系统注册表中的名为HKEY_DTN_DATA的主键中包含了系统的动态信息,该主键常数为H80000006。
4.数据类型所对应的常数
注册表中常用的数据类型和对应常数如表所示。
表数据类型常数
类型名称
数据类型
对应常数
REG_BINARY
二进制数据
3
REG_DWORD
4字节数据
4
DWORD_BIG_ENDIAN
逆序存放的4字节数据
5
REG_DWORK_LITTLE_ENDIAN
4字节数值数据
4
REG_EXPAND_SZ
带变量的文本字符串
2
REG_LINK
文件路径
6
REG_MULTI_SZ
以Null分隔的字符串
7
REG_NONE
无需分类的数据
0
REG_RESOURCE_LIST
设备使用资源列表
8
REG_RESOURCE_REQUIREMENTS_LIST
驱动程序要求的资源列表
10
REG_SZ
文本字符串
1
★
读写注册表
注册表是包含Windows安装、用户爱好、以及已安装软件和设备的所有配置信息的核心存储库。
因为现在的应用程序大多都使用WindowsInstaller来完成安装,开发人员就不必直接操作注册表来安装程序。
但是,如果发布完整的应用程序还是要使用注册表来保存配置信息。
为了更方便的完成这些设置(如通过注册表优化系统),.NETFreamwork提供了访问注册表的类,例如Registry类、RegistryKey类,这两个类都在Microsoft.Win32命名空间中。
Microsoft.Win32命名空间提供两种类型的类:
处理由操作系统引发的事件的类和操作系统注册表的类,具体说明如表所示。
表Microsoft.Win32命名空间的类列表
类
说明
IntranetZoneCredentialPolicy
定义凭据策略,该凭据策略将用于使用WebRequest(发出对统一资源标识符URI)的请求)及其派生类发出的资源请求。
PowerModeChangedEventArgs
为PowerModeChanged(当用户挂起或继续系统时发生)事件提供数据。
Registry
提供表示Windows注册表中的根项的RegistryKey(表示Windows注册表中的项级节点)对象,并提供访问项/值对的static方法。
RegistryKey
表示Windows注册表中的项级节点。
此类是注册表封装。
SessionEndedEventArgs
为SessionEnded(当用户注销或关闭系统时发生)事件提供数据。
SessionEndingEventArgs
为SessionEnding(当用户试图注销或关闭系统时发生)事件提供数据。
SessionSwitchEventArgs
为SessionSwitch(更改当前登录的用户时发生)事件提供数据。
SystemEvents
提供对系统事件通知的访问,无法继承此类。
TimerElapsedEventArgs
为TimerElapsed(在窗口计时器间隔过期时发生)事件提供数据。
UserPreferenceChangedEventArgs
为UserPreferenceChanged事件(在用户首选项更改后发生)提供数据。
UserPreferenceChangingEventArgs
为UserPreferenceChanging事件(当用户首选项更改时发生)提供数据。
★
C#向注册表写入信息
熟悉计算机的读者都明白注册表的重要性,因为注册表内存储着重要的配置信息,这个重要信息的写入可以通过Registry类实现。
为了使编程人员能够快速的向注册表写入信息,Registry类将注册表中7大主键封装为公有的静态域,而这些静态域分别代表着注册表中的7个基本的主键,这样在向注册表中写入信息时就可以通过Registry类的7个公有的静态域与注册表一一映射。
具体描述如表所示。
表Registry类封装的7个公有的静态域列表
静态域
说明
ClassesRoot
定义文档的类型(或类)以及与那些类型关联的属性。
该字段读取Windows注册表基项HKEY_CLASSES_ROOT
CurrentConfig
包含有关非用户特定的硬件的配置信息。
该字段读取Windows注册表基项HKEY_CURRENT_CONFIG
CurrentUser
包含有关当前用户首选项的信息。
该字段读取Windows注册表基项HKEY_CURRENT_USER
DynData
包含动态注册表数据。
该字段读Windows注册表基项HKEY_DYN_DATA
LocalMachine
包含本地计算机的配置数据。
该字段读取Windows注册表基项HKEY_LOCAL_MACHINE
PerformanceData
包含软件组件的性能信息。
该字段读取Windows注册表基项HKEY_PERFORMANCE_DATA
通过Registry类中的GetValue方法、SetValue方法可以实现向注册表中写入信息。
(1)GetValue方法
检索与指定的注册表项中的指定名称关联的值。
如果在指定的项中未找到该名称,则返回您提供的默认值;或者,如果指定的项不存在,则返回空引用。
语法:
publicstaticObjectGetValue
(
stringkeyName,
stringvalueName,
ObjectdefaultValue
)
参数:
keyName:
以有效注册表根(如“HKEY_CURRENT_USER”)开头的键的完整注册表路径。
ValueName:
名称/值对的名称。
DefaultValue:
当name不存在时返回的值。
返回值:
如果由keyName指定的子项不存在,则返回空引用;否则,返回与valueName关联的值;或者,如果未找到valueName,则返回defaultValue。
例如,通过GetValueNames方法检索"HKEY_CURRENT_USER\AppEvents\EventLabels"子键下包含的所有子项,然后检索包含与此名称关联的值;
RegistryKeyrk=Registry.CurrentUser;
RegistryKeysys=rk.OpenSubKey(@"AppEvents\EventLabels");
foreach(stringstrinsys.GetSubKeyNames())
{
RegistryKeysikey=sys.OpenSubKey(str);//打开子键
foreach(stringsVNameinsikey.GetValueNames())
{
this.listBox1.Items.Add(sikey.GetValue(sVName));
}
}
(2)SetValue方法
设置指定的注册表项的指定名称/值对。
如果指定的项不存在,则创建该项。
语法:
publicstaticvoidSetValue
(
stringkeyName,
stringvalueName,
Objectvalue
)
参数:
keyName:
以有效注册表根(如“HKEY_CURRENT_USER”)开头的键的完整注册表路径。
ValueName:
名称/值对的名称。
Value:
要存储的值。
例如,通过SetValue方法在“HKEY_CURRENT_CONFIG”键下创建一个名为mrsoft的子键,然后在mrsoft子键下添加一个名为mr的键值项同时为这个键值项添加键值(hywork);
Registry.SetValue(“HKEY_CURRENT_CONFIG\\mrsoft”,“mr”,“hywork”);
示例写入注册表
向“HKEY_CURRENT_CONFIG”键下写入信息,。
首先硧定要对7个基本主键的那一个主键进行操作,这里以“HKEY_CURRENT_CONFIG”为例,找到要操作的主键后便可以通过Registry类的SetValue方法将信息写入注册表中,程序代码如下。
privatevoidbutton1_Click(objectsender,EventArgse)
{
try
{
stringstrPath="HKEY_CURRENT_CONFIG";//设默认值
stringkeyName=strPath+"\\"+this.textBox2.Text.Trim().ToString();
objectobj=(object)this.textBox4.Text.Trim();
stringstrName=this.textBox3.Text.Trim().ToString();
Registry.SetValue(keyName,strName,obj,RegistryValueKind.String);
MessageBox.Show("写入成功");
}
catch
{
return;
}
}
★
C#将应用软件的使用次数写入注册表
在软件推广的时候,经常先让用户试用一定的次数,如果超过试用的次数,则不允许再试用本软件,这样的程序可以通过将软件的试用次数写入注册表来实现。
下面的示例实现了如果用户使用本程序超过30次,则不允许用户使用,并提示用户进行注册。
其设计原理是:
首先判断在注册表指定的位置处是否建立了限制软件试用次数的数据项,如果该数据项存在,则使用Registry类的GetValue函数读取“使用次数”,然后用Registry类的SetValue函数设置“使用次数”为读取的“使用次数”加1;如果该数据项不存在,则使用Registry类的SetValue函数设置“使用次数”为1。
代码如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{
try
{
Int32tLong=(Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mrsoft","UserTimes",0);
if(tLong<30)
{
intTimes=tLong+1;
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mrsoft","UserTimes",Times);
MessageBox.Show("这是您第"+Times+"次使用。
");
}
else
{
MessageBox.Show("试用期已到请重新注册");
Application.Exit();//退出应用程序
}
}
catch
{
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mrsoft","UserTimes",
First_Count,RegistryValueKind.DWord);
MessageBox.Show("感谢您第次使用本软件");
}
}
★
C#保护注册表
注册表在操作系统中起着非常重要的地位,如果注册表被非法用户修改,很有可能使系统中的某些程序无法运行,甚至会造成整个系统的崩溃。
为了防止由于非法用户擅自使用计算机给用户带来的损害,用户必须使用相关技术来保护注册表。
为了防止由于注册表的改动而对计算机产生影响,用户可以通过禁止使用注册表编辑器的方法来禁止用户使用注册表。
过通Microsoft.Win32命名空间下的Registry类与RegistryKey类,实现在注册表中的“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System”子项中新建一个名为DisableRegistryTools的双字节值项,并将该值项的数值数据设置为1。
如果要恢复注册表为允许使用的状态,可以使用RegDeleteKey类删除System子项。
注意:
在进行此项操作之前,笔者建议用户应从安全角度出发,首先对注册表文件进行备份或准备另外一个注册表修改工具,因为在进行此项操作之后,用户就无法使用注册表编辑器来打开注册表了。
另外,如果用户需要使用注册表编辑器,可以在“安全模式”下对注册表进行修改等操作。
通过操作注册表控制“注册表编辑器”,单击“禁用Regedit”按钮,这时在“运行”窗口中输入“regedit”命令,将弹出不可用提示信息。
这样便可以防止非法用户修改注册表。
为了方便使用,这里提供了启用注册表的功能。
单击“启用Regedit”按钮后,这时用户便可以正常操作注册表。
禁用注册表编辑器,通过Registry类的CreateSubKey方法在"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"键下创建一个“DisableRegistryTools”子键并且另其键值为“1”,程序代码如下:
privatevoidbutton2_Click(objectsender,EventArgse)
{
try
{
RegistryKeyrgK=Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
rgK.SetValue("DisableRegistryTools",1,RegistryValueKind.DWord);
MessageBox.Show("禁用成功!
!
!
");
}
catch{}
}
启用注册表编辑器,通过RegistryKey类的DeleteSubKey方法删除"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"键,便可以正常使用注册表编辑器,程序代码如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{
try
{
RegistryKeyrgK=Registry.CurrentUser;
rgK.DeleteSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
MessageBox.Show("启用成功!
!
!
");
}
catch{}
}
★
通过注册表优化系统(C#)
一台计算机怎么才能满足人们的要求,首当其充的就是速度。
这恰恰是计算机被越来越多的用户所接受的原因,但随着用户为自己的计算机安装很多软件后会明显的发显“开/关”机的速度很慢,右键点击桌面时快捷菜单要等待几秒才能显示,针对这些问题笔者在此通过操作注册表来实现优化。
本实例通过RegistryKey类与Registry类对注册表中的键值进行写入与删除,实现通过注册表优化系统的功能,其中包括“加快开/关机速度”、“加快自动刷新率”、“加快菜单显示速度”等。
设置注册表中“HKEY_CURRENT_USER\ControlPanel\Desktop”键下的“HungAppTimeout”值为400,将“WaitToKillAppTimeout”键的数值设置为1000,同时再把“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control”键下“HungAppTimeout”值设置为400,将字符串“WaitToKillServiceTimeout”的数值设置为1000。
运行程序,单击“加快开/关机速度”按钮,重新启动计算机后,便可以得到理想的开关机效果。
代码如下:
privatevoid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 注册表