📄 c++builder中注册表的操作.htm
字号:
<html><body>
<p>首先,先介绍一下TRegistry的属性和方法:</p>
<p>TRegistry类一共有四个属性。</p>
<table width="622" border="0" cellspacing="1" cellpadding="0" bgcolor="#CCCCCC">
<tr bgcolor="#003333">
<td width="100"><font color="#FFFFFF">属性</font></td>
<td width="80"><font color="#FFFFFF">类型</font></td>
<td width="74%"><font color="#FFFFFF">描述</font></td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="100">CurrentKey</td>
<td width="80">int</td>
<td width="74%">包含当前键值的值,但它的意思不太好懂,所以不太常用</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="100">RootKey</td>
<td width="80">int</td>
<td width="74%">当前键值的根键,BCB定义有枚举常量:HKEY_CURRENT_USER、HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG、HKEY_DYN_DATA、HKEY_USERS。分别对应注册表中相应的主键。生成一个TRegistry类的实例时RootKye缺省值为HKEY_CURRENT_USER</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="100">CurrentPath</td>
<td width="80">AnsiString</td>
<td width="74%">当前键值的文本描述,\HKEY_CURRENT_USER\Software\Borland的CurrentPath="Software\Borland",而RootKey=HKEY_CURRENT_USER</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="100">LazyWrite</td>
<td width="80">bool</td>
<td width="74%">值为true:只要关闭一个键,就立即返回应用程序。值为false:必须写完注册表后才返回。其缺省值为true。</td>
</tr>
</table>
<p>TRegistry类的方法比较多,择其常用的简要说明如下:</p>
<table width="622" border="0" cellspacing="1" cellpadding="0" bgcolor="#CCCCCC">
<tr bgcolor="#003333">
<td width="200"><font color="#FFFFFF">方法</font></td>
<td width="82%"><font color="#FFFFFF">描述</font></td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200" valign="top">CloseKey()</td>
<td width="82%">关闭一个键值并向键值写数据,只要对键值操作完毕后就应该关闭它,不过你可以不必调用此方法,因为TRegistry的析构函数会自动调用它。</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">DeleteKey(AnsiString)</td>
<td width="82%">删除? ,参数为要删除的键值,如果参数为空字符串,则删除当前键值</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">OpenKey(Ansistring,bool)</td>
<td width="82%">打开一个键值,如果这个键值不存在,将由第二个参数决定是否自动建立。</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">LoadKey(AnsiString,AnsiString)</td>
<td width="82%">从文件装入键值,第一个参数为键值,第二个参数为文件名</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">KeyExists(AnsiString)</td>
<td width="82%">检测一个键值是否存在。</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">SaveKey(AnsiString,AnsiString)</td>
<td width="82%">把一个键值保存到文件,参数说明参见LoadKey()</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">ReadInteger(AnsiString)</td>
<td width="82%">读出一个键值为整数,如果失败将抛出异常。同此函数类似的还有ReadBool()、ReadString()、ReadFloat()、ReadDateTome()、ReadBinaryData()等,用来读出不同类型的键值。</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">ValueExists(AnsiString)</td>
<td width="82%">检测一个值是否存在。</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="200">WriteInteger(AnsiString,int)</td>
<td width="82%">写一个键值为整数,如果失败将抛出异常。同此函数类似的还有WriteBool()、WriteString()、WriteFloat()、WriteDateTome()、WriteBinaryData()等,用来写入不同类型的键值。</td>
</tr>
</table>
<p>利用TRegistry是很容易的,一般来说,有以下四步操作:</p>
<blockquote>
<p>1) 建立TRegistry类<br>
2)利用OpenKey()方法打开一个键值<br>
3)用ReadType()和WriteType()读写键值<br>
4)调用CloseKey()关闭一个键值。</p>
</blockquote>
<p> 值得注意的是:在使用TRegistry类时,必须要加入此类的头文件:#include$#@60;Rgistry.hpp$#@62;,否则会发生什么,只要稍有C语言基础都会明白。</p>
<p> 好了,说了那么多,也该举一个实例来说明,下面我就以我的《WinNT自动登录》来说明TRegistry类的用法。</p>
<p> WinNT的用户都知道,WinNT在启动时需要按Ctrl+Alt+Del登录,即便没有密码也是如此.虽然WinNT不会象
WIN9X那样经常死机,但每次开机都要这样还是有点烦.能 不能让WinNT每次启动自动登录呢?其实只要把注册表的一 个属性AutoAdminLogon的值设置为"1"即可,可惜的是这
样做只能管一次,每次启动后WinNT就会自动把它的值改为 "0"(该死的Bill!).如果每次都要修改注册表,还不如每次手动登录呢!写个程序在启动后自动修改这个值就OK了。</p>
<p> 首先新建一个工程,在窗体放入4个文本框,分别命名为:dUser、edPasswd、edRePasswd、edDomain。分别用来输入用户名、登录口令、重输口令和域,把edPasswd和edRePasswd的PasswordChar属性改为"*"(密码方式输入)。再加入2个复选框来选择是否自动登录(chkAuto)和自动运行(chkAutorun),一个定时器(Timer1),2个按纽(bbtOK、bbtCancel)和一些Label,调整布局如下图:</p>
<p><img src="25_0.gif" width="269" height="343"> </p>
<p>打开代码窗口,在头部输入以下代码:</p>
#include<registry.hpp> TRegistry ®key=* new TRegistry();//定义全局变量:注册表类。
int delay=0;//定义全局变量,延时时间
<p>然后选择窗体的OnCreat事件,输入以下代码:</p>
<p>regkey.RootKey=HKEY_LOCAL_MACHINE;//设置根键 //打开自动登录所在的键 <br>
regkey.OpenKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",true);
<br>
//以下3句打开Windows自动运行的键值。 TRegistry &AutoRun=* new TRegistry();
AutoRun.RootKey=HKEY_LOCAL_MACHINE; <br>
AutoRun.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
<br>
if(strlen(CmdLine)>Application->ExeName.Length()+3)//如果带参数运行则是要卸载
<br>
{</p>
<blockquote>
<p> AutoRun.DeleteValue("Windows NT Auto Logon");//删除自己加入的属性<br>
regkey.DeleteValue("Windows NT Auto Logon"); delete &AutoRun;
<br>
Application->Terminate();//终止应用程序 return; } //把本程序写入自动运行。<br>
AutoRun.WriteString("Windows NT Auto Logon",Application->ExeName);
<br>
delete &AutoRun; <br>
edDomain->Text=regkey.ReadString("DefaultDomainName"); //读出域名
<br>
edUser->Text=regkey.ReadString("DefaultUserName"); //读出用户名 <br>
chkAuto->Checked=true;<br>
chkAutorun->Checked=regkey.ReadString("Windows NT Auto Logon")=="1"?true:false;
//本程序是否自动运行<br>
edPasswd->Text=regkey.ReadString("DefaultPasswd"); //读出口令<br>
setControl(!chkAutorun->Checked); //如果是自动运行状态把其他屏蔽,反之亦然 <br>
if(chkAutorun->Checked)<br>
{</p>
<blockquote>
<p> Timer1->Enabled=true; //自动运行开始计时 edRePasswd->Text=edPasswd->Text;
</p>
</blockquote>
<p>}</p>
</blockquote>
<p>} </p>
<p>其中setControl()的功能是屏蔽几个组件,定义如下:</p>
<p>首先在窗体的头文件窗体类定义加入void setControl(bool);</p>
<p>其函数体如下(窗体名为fmMain):</p>
<p>void TfmMain::setControl(bool t)<br>
{</p>
<blockquote>
<p> edUser->Enabled= t; <br>
edRePasswd->Enabled= t;<br>
edPasswd->Enabled= t;<br>
edDomain->Enabled= t;<br>
chkAuto->Enabled= t;</p>
</blockquote>
<p> } </p>
<p>在chkAutoRun的OnClick事件中根据是否选择了自动运行来决定是否启动定时器</p>
<p>setControl(!chkAutorun->Checked);//如果是自动运行状态把其他屏蔽,反之亦然 if(!chkAutorun->Checked)
<br>
{</p>
<blockquote>
<p> Timer1->Enabled=false;//如果不是自动运行,定时器失效 delay=0;</p>
</blockquote>
<p> } <br>
else</p>
<blockquote>
<p> Timer1->Enabled=true;//否则定时器有效 </p>
</blockquote>
<p>在按纽bbtOK的OnClick事件中输入以下代码,其功能是写入注册表。</p>
<p>if(edRePasswd->Text==edPasswd->Text)//如果密码正确 <br>
{</p>
<blockquote>
<p> regkey.WriteString("DefaultDomainName",edDomain->Text);//写入域名<br>
regkey.WriteString("DefaultUserName",edUser->Text);//写入用户名<br>
regkey.WriteString("AutoAdminLogon",chkAuto->Checked?"1":"0");//写入是否自动登录<br>
regkey.WriteString("Windows NT Auto Logon",chkAutorun->Checked?"1":"0");//写入是否自动运行
<br>
regkey.WriteString("DefaultPasswd",edPasswd->Text);//写入密码<br>
if(!chkAutorun->Checked)//如果不自动运行 <br>
{</p>
<blockquote>
<p> TRegistry &AutoRun=* new TRegistry();<br>
AutoRun.RootKey=HKEY_LOCAL_MACHINE; //找到自动启动 <br>
AutoRun.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);<br>
AutoRun.DeleteValue("Windows NT Auto Logon");//删除自己加入的属性<br>
delete &AutoRun; </p>
</blockquote>
<p>} <br>
Application->Terminate();//程序终止。 </p>
</blockquote>
<p>} <br>
else</p>
<p> {</p>
<blockquote>
<p> ShowMessage("密码错误!"); edPasswd->Text=""; </p>
</blockquote>
<p>} </p>
<p>当程序自动运行时,延时3秒后写入注册表,在Timer1的OnTimer事件中写入如下代码:</p>
delay++; if(delay>=3)//延时三秒到 bbtOK->Click();//单击《确定》按纽,写入注册表
<p>然后在bbtCancel中加入终止程序的代码:Application->Terminate();我们的程序就算完成了,真的完了吗?NO!我们在开始的时侯用new生成了regkey,应该要用delete删除它,所以在窗体的OnClose事件中加入delete
&regkey就OK了。</p>
<p>如果选择了自动运行,程序就能在每次启动时延时3秒,然后在修改注册表中相应的项后退出,释放系统资源。</p>
<p>怎么样?很简单吧!如果我们平时注意收集《电脑报》等报刊杂志上的有关注册表设置的文章,再有了功能强大使用方便的C++Builder,我们也可以写出什么"Windows
超级设置"之类的程序了。</p>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -