100165776.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 459 行 · 第 1/2 页
HTM
459 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
30.4.2 .NET注册表类
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165776.htm">
30.4.2 .NET注册表类
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165776.htm'><font color='red'>30.4.2 .NET注册表类</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165773.htm'>30.3.3 读写文本文件</a></div><div style='float:right;width:49%'>·<a href='100165774.htm'>30.4 读写注册表</a></div><div style='float:left;width:49%'>·<a href='100165775.htm'>30.4.1 注册表</a></div><div style='float:right;width:49%'>·<a href='100165777.htm'>30.4.3 SelfPlacingWindow示例</a></div><div style='float:left;width:49%'>·<a href='100165778.htm'>30.5 小结</a></div><div style='float:right;width:49%'>·<a href='100165779.htm'>31.1 WebClient类</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;margin-left:
0cm'><a FTEL="_Toc507815216"><span lang=EN-US>30.4.2 .NET</span></a><span
style='font-family:黑体'>注册表类</span></h3>
<p class=MsoNormal><a FTEL=RegistryKey1></a><a FTEL=Registry2><span
style='font-family:宋体'>要访问注册表,可以使用</span></a><span
lang=EN-US>Microsoft.Win32</span><span style='font-family:宋体'>命名空间中的两个类</span><span
lang=EN-US>Registry </span><span style='font-family:宋体'>和</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>。</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>实例表示一个注册表项,这个类的方法可以浏览子键、创建新键、读取或修改键中的值。换言之,该类可以完成对注册表项进行的所有操作</span><span
lang=EN-US>(</span><span style='font-family:宋体'>除了设置键的安全级别之外</span><span
lang=EN-US>)</span><span style='font-family:宋体'>。</span><span lang=EN-US>RegistryKey</span><span
style='font-family:宋体'>类可以用于完成对注册表的所有操作。</span><span lang=EN-US>Registry</span><span
style='font-family:宋体'>是不能实例化的一个类。它的作用只是提供表示顶级键的</span><span lang=EN-US>RegistryKey</span><span
style='font-family:宋体'>实例</span><span lang=EN-US>(</span><span
style='font-family:宋体'>不同的巢</span><span lang=EN-US>)</span><span
style='font-family:宋体'>,以便开始在注册表中浏览。</span><span lang=EN-US>Registry</span><span
style='font-family:宋体'>是通过静态属性来提供这些实例的,这些属性共有</span><span lang=EN-US>7</span><span
style='font-family:宋体'>个,分别是</span><span lang=EN-US>ClassesRoot</span><span
style='font-family:宋体'>、</span><span lang=EN-US>CurrentConfig</span><span
style='font-family:宋体'>、</span><span lang=EN-US>CurrentUser</span><span
style='font-family:宋体'>、</span><span lang=EN-US>DynData</span><span
style='font-family:宋体'>、</span><span lang=EN-US>LocalMachine</span><span
style='font-family:宋体'>、</span><span lang=EN-US>PerformanceData</span><span
style='font-family:宋体'>和</span><span lang=EN-US> Users</span><span
style='font-family:宋体'>。用户可以很快猜出它们分别与哪个巢相对应。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>例如,要获得一个表示</span><span
lang=EN-US>HKLM</span><span style='font-family:宋体'>键的</span><span lang=EN-US>RegistryKey</span><span
style='font-family:宋体'>实例,可以编写下面的代码:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey hklm =
Registry.LocalMachine;</span></p>
<p class=MsoNormal><span style='font-family:宋体'>获得</span><span lang=EN-US>RegistryKey</span><span
style='font-family:宋体'>对象引用的过程,视为打开一个键。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>用户可能会认为,因为注册表的层次结构类似于文件系统,所以</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>的方法类似于</span><span
lang=EN-US>DirectoryInfo</span><span style='font-family:宋体'>的方法,但实际上并非如此。访问注册表的方式通常不同于使用文件和文件夹的方式,</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>执行的方法可以反映这种不同。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>最明显的区别是如何在注册表的给定位置上打开一个注册表项。</span><span
lang=EN-US>Registry</span><span style='font-family:宋体'>类没有用户可以使用的公共构造函数,也没有任何可以直接通过键的名称来访问键的方法。但可以在相关的巢中从上至下浏览该键。如果要实例化一个</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>对象,惟一的方式是从</span><span
lang=EN-US>Registry</span><span style='font-family:宋体'>的静态属性开始,向下浏览。例如,要读取</span><span
lang=EN-US>HKLM/Software/Microsoft</span><span style='font-family:宋体'>键中的一些数据,可以使用下面的代码获得它的一个引用:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>RegistryKey hklm = Registry.LocalMachine;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey
hkSoftware = hklm.OpenSubKey("Software");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey
hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");</span></p>
<p class=MsoNormal><span style='font-family:宋体'>以这种方式访问注册表项是只读访问。如果要写入该键</span><span
lang=EN-US>(</span><span style='font-family:宋体'>包括写入其值,或创建和删除其子键</span><span
lang=EN-US>)</span><span style='font-family:宋体'>,就需要使用</span><span lang=EN-US>OpenSubKey</span><span
style='font-family:宋体'>的另一个重写方法,该方法的第二个参数是</span><span lang=EN-US>bool</span><span
style='font-family:宋体'>类型,表示是否要对该键进行读写访问。例如,如果要修改</span><span lang=EN-US>Microsoft</span><span
style='font-family:宋体'>键</span><span lang=EN-US>(</span><span style='font-family:
宋体'>并假定用户是一个系统管理员,有修改该键的许可</span><span lang=EN-US>)</span><span
style='font-family:宋体'>,就应编写如下代码:</span></p>
<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>RegistryKey hklm = Registry.LocalMachine;</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey
hkSoftware = hklm.OpenSubKey("Software");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey
hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);</span></p>
<p class=MsoNormal><span style='font-family:宋体'>因为这个键包含</span><span lang=EN-US>Microsoft</span><span
style='font-family:宋体'>应用程序使用的信息,在大多数情况下,就不应修改这个特定键。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>如果这个键已经存在,就应调用</span><span
lang=EN-US>OpenSubKey()</span><span style='font-family:宋体'>方法。如果这个键不存在,就返回一个空引用。如果要创建一个键,就应使用</span><span
lang=EN-US>CreateSubKey()</span><span style='font-family:宋体'>方法</span><span
lang=EN-US>(</span><span style='font-family:宋体'>该方法会通过返回的引用,自动提供该键的读写访问</span><span
lang=EN-US>)</span><span style='font-family:宋体'>:</span></p>
<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><a
FTEL=CreateSubKey><span lang=EN-US>RegistryKey hklm = Registry.LocalMachine;</span></a></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey
hkSoftware = hklm.OpenSubKey("Software");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>RegistryKey hkMine =
hkSoftware.CreateSubKey("MyOwnSoftware"); </span></p>
<p class=MsoNormal><span lang=EN-US>CreateSubKey()</span><span
style='font-family:宋体'>工作的方式非常有趣:如果键不存在,它就创建这个键。但如果键已经存在,它就会返回一个表示该键的</span><span
lang=EN-US>RegistryKey</span><span style='font-family:宋体'>实例。这个方法采用这样的工作方式,其原因是用户总是可以使用这个键。注册表包含长期数据,例如</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>和各种应用程序的配置信息。因此用户并不需要经常显式地创建键。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>更常见的是,应用程序需要确保某些数据在注册表中是存在的。换言之,如果这些数据不存在,就要创建相关的键,但如果它们存在,就不需要做任何事。</span><span
lang=EN-US>CreateSubKey()</span><span style='font-family:宋体'>就可以完成这项任务。与</span><span
lang=EN-US>FileInfo.Open()</span><span style='font-family:宋体'>的情况不同,</span><span
lang=EN-US>CreateSubKey()</span><span style='font-family:宋体'>不会删除任何数据。如果要删除注册表项,就需要显式调用</span><span lang=EN-US>RegistryKey.Delete()</span><span style='font-family:宋体'>方法,因此注册表对于</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>是非常重要的。如果删除了一些重要的键,就会中断</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>的执行,此时就需要调试</span><span
lang=EN-US>C#</span><span style='font-family:宋体'>注册表调用了。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>定位了要读取或修改的注册表项后,就可以使用</span><span lang=EN-US>SetValue() </span><span style='font-family:宋体'>或</span> <span lang=EN-US>GetValue()</span><span style='font-family:宋体'>方法设置或获取该键中的值。这两个方法的参数都是一个字符串,其中字符串给出了值的名称,</span><span
lang=EN-US>SetValue()</span><span style='font-family:宋体'>还需要一个包含值的信息的对象引用。这个参数定义为对象引用,实际上可以是任何一个类的引用。</span><span
lang=EN-US>SetValue()</span><span style='font-family:宋体'>根据所提供的类的类型,确定把值设置为</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>、</span><span lang=EN-US>REG</span><span
lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>DWORD</span><span style='font-family:宋体'>,还是</span><span lang=EN-US>
REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>BINARY</span><span style='font-family:宋体'>。例如:</span></p>
<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><a
FTEL=GetValue><span lang=EN-US>RegistryKey hkMine =
HkSoftware.CreateSubKey("MyOwnSoftware");</span></a></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>hkMine.SetValue("MyStringValue",
"Hello World");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>hkMine.SetValue("MyIntValue",
20);</span></p>
<p class=MsoNormal><span style='font-family:宋体'>这段代码设置键包含两个值:</span><span
lang=EN-US>MyStringValue</span><span style='font-family:宋体'>的类型是</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>,而</span><span lang=EN-US>MyIntValue</span><span
style='font-family:宋体'>的类型是</span><span lang=EN-US>REG</span><span lang=EN-US
style='font-family:"Baskerville BE Regular"'>_</span><span lang=EN-US>DWORD</span><span
style='font-family:宋体'>,这里只考虑这两种类型,在后面的示例中会使用它们。</span></p>
<p class=MsoNormal><span lang=EN-US>RegistryKey.GetValue()</span><span
style='font-family:宋体'>的工作方式也是这样。它返回一个对象引用,如果该方法检测到值的类型为</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>,就返回一个字符串引用,如果值的类型为</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>DWORD</span><span style='font-family:宋体'>,就返回一个</span><span
lang=EN-US>int</span><span style='font-family:宋体'>型值。</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>string stringValue =
(string)hkMine.GetValue("MyStringValue");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>int intValue =
(int)hkMine.GetValue("MyIntValue"); </span></p>
<p class=MsoNormal><span style='font-family:宋体'>最后,完成了读取或修改数据后,应关闭该键:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>hkMine.Close();</span></p>
<p class=MsoNormal><span lang=EN-US>RegistryKey</span><span style='font-family:
宋体'>有许多方法和属性。表</span><span lang=EN-US>30-4</span><span style='font-family:宋体'>和</span><span
lang=EN-US>30-5</span><span style='font-family:宋体'>列出了其中最有用的方法和属性。</span></p>
<p class=a5 style='margin-top:8.15pt'><span style='font-family:黑体'>表</span> <span
lang=EN-US> 30-4</span></p>
<div align=center>
<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
style='margin-left:4.2pt;border-collapse:collapse;border:none'>
<tr>
<td width=197 valign=top style='width:147.45pt;border:solid windowtext 1.0pt;
border-left:none;padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a2><span style='font-family:黑体'>属</span><span lang=EN-US> </span><span
style='font-family:黑体'>性</span><span lang=EN-US> </span><span
style='font-family:黑体'>名</span></p>
</td>
<td width=387 valign=top style='width:290.6pt;border-top:solid windowtext 1.0pt;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?