C++Builder中注册表的操作
僮骶头浅5募虻チ耍旅嫖揖鸵砸桓鍪道此得鱐Registry类的用法。
首先,先介绍一下TRegistry的属性和方法:
TRegistry类一共有四个属性。
属性 类型 描述
CurrentKey int 包含当前键值的值,但它的意思不太好懂,所以不太常用
RootKey int 当前键值的根键,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
CurrentPath AnsiString 当前键值的文本描述,\HKEY_CURRENT_USER\Software\Borland的CurrentPath="Software\Borland",而RootKey=HKEY_CURRENT_USER
LazyWrite bool 值为true:只要关闭一个键,就立即返回应用程序。值为false:必须写完注册表后才返回。其缺省值为true。
TRegistry类的方法比较多,择其常用的简要说明如下:
方法 描述
CloseKey() 关闭一个键值并向键值写数据,只要对键值操作完毕后就应该关闭它,不过你可以不必调用此方法,因为TRegistry的析构函数会自动调用它。
DeleteKey(AnsiString) 删除 ,参数为要删除的键值,如果参数为空字符串,则删除当前键值
OpenKey(Ansistring,bool) 打开一个键值,如果这个键值不存在,将由第二个参数决定是否自动建立。
LoadKey(AnsiString,AnsiString) 从文件装入键值,第一个参数为键值,第二个参数为文件名
KeyExists(AnsiString) 检测一个键值是否存在。
SaveKey(AnsiString,AnsiString) 把一个键值保存到文件,参数说明参见LoadKey()
ReadInteger(AnsiString) 读出一个键值为整数,如果失败将抛出异常。同此函数类似的还有ReadBool()、ReadString()、ReadFloat()、ReadDateTome()、ReadBinaryData()等,用来读出不同类型的键值。
ValueExists(AnsiString) 检测一个值是否存在。
WriteInteger(AnsiString,int) 写一个键值为整数,如果失败将抛出异常。同此函数类似的还有WriteBool()、WriteString()、WriteFloat()、WriteDateTome()、WriteBinaryData()等,用来写入不同类型的键值。
利用TRegistry是很容易的,一般来说,有以下四步操作:
1) 建立TRegistry类
2)利用OpenKey()方法打开一个键值
3)用ReadType()和WriteType()读写键值
4)调用CloseKey()关闭一个键值。
值得注意的是:在使用TRegistry类时,必须要加入此类的头文件:#include$#@60;Rgistry.hpp$#@62;,否则会发生什么,只要稍有C语言基础都会明白。
好了,说了那么多,也该举一个实例来说明,下面我就以我的《WinNT自动登录》来说明TRegistry类的用法。
WinNT的用户都知道,WinNT在启动时需要按Ctrl+Alt+Del登录,即便没有密码也是如此.虽然WinNT不会象 WIN9X那样经常死机,但每次开机都要这样还是有点烦.能 不能让WinNT每次启动自动登录呢?其实只要把注册表的一 个属性AutoAdminLogon的值设置为"1"即可,可惜的是这 样做只能管一次,每次启动后WinNT就会自动把它的值改为 "0"(该死的Bill!).如果每次都要修改注册表,还不如每次手动登录呢!写个程序在启动后自动修改这个值就OK了。
首先新建一个工程,在窗体放入4个文本框,分别命名为:dUser、edPasswd、edRePasswd、edDomain。分别用来输入用户名、登录口令、重输口令和域,把edPasswd和edRePasswd的PasswordChar属性改为"*"(密码方式输入)。再加入2个复选框来选择是否自动登录(chkAuto)和自动运行(chkAutorun),一个定时器(Timer1),2个按纽(bbtOK、bbtCancel)和一些Label,调整布局如下图:
打开代码窗口,在头部输入以下代码:
#include TRegistry ®key=* new TRegistry();//定义全局变量:注册表类。 int delay=0;//定义全局变量,延时时间
然后选择窗体的OnCreat事件,输入以下代码:
regkey.RootKey=HKEY_LOCAL_MACHINE;//设置根键 //打开自动登录所在的键
regkey.OpenKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",true);
//以下3句打开Windows自动运行的键值。 TRegistry &AutoRun=* new TRegistry(); AutoRun.RootKey=HKEY_LOCAL_MACHINE;
AutoRun.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
if(strlen(CmdLine)>Application->ExeName.Length()+3)//如果带参数运行则是要卸载
{
AutoRun.DeleteValue("Windows NT Auto Logon");//删除自己加入的属性
regkey.DeleteValue("Windows NT Auto Logon"); delete &AutoRun;
Application->Terminate();//终止应用程序 return; } //把本程序写入自动运行。
AutoRun.WriteString("Windows NT Auto Logon",Application->ExeName);
delete &AutoRun;
edDomain->Text=regkey.ReadString("DefaultDomainName"); //读出域名
edUser->Text=regkey.ReadString("DefaultUserName"); //读出用户名
chkAuto->Checked=true;
chkAutorun->Checked=regkey.ReadString("Windows NT Auto Logon")=="1"?true:false; //本程序是否自动运行
edPasswd->Text=regkey.ReadString("DefaultPasswd"); //读出口令
setControl(!chkAutorun->Checked); //如果是自动运行状态把其他屏蔽,反之亦然
if(chkAutorun->Checked)
{
Timer1->Enabled=true; //自动运行开始计时 edRePasswd->Text=edPasswd->Text;
}
}
其中setControl()的功能是屏蔽几个组件,定义如下:
首先在窗体的头文件窗体类定义加入void setControl(bool);
其函数体如下(窗体名为fmMain):
void TfmMain::setControl(bool t)
{
edUser->Enabled= t;
edRePasswd->Enabled= t;
edPasswd->Enabled= t;
edDomain->Enabled= t;
chkAuto->Enabled= t;
}
在chkAutoRun的OnClick事件中根据是否选择了自动运行来决定是否启动定时器
setControl(!chkAutorun->Checked);//如果是自动运行状态把其他屏蔽,反之亦然 if(!chkAutorun->Checked)
{
Timer1->Enabled=false;//如果不是自动运行,定时器失效 delay=0;
}
else
Timer1->Enabled=true;//否则定时器有效
在按纽bbtOK的OnClick事件中输入以下代码,其功能是写入注册表。
if(edRePasswd->Text==edPasswd->Text)//如果密码正确
{
regkey.WriteString("DefaultDomainName",edDomain->Text);//写入域名
regkey.WriteString("DefaultUserName",edUser->Text);//写入用户名
regkey.WriteString("AutoAdminLogon",chkAuto->Checked?"1":"0");//写入是否自动登录
regkey.WriteString("Windows NT Auto Logon",chkAutorun->Checked?"1":"0");//写入是否自动运行
regkey.WriteString("DefaultPasswd",edPasswd->Text);//写入密码
if(!chkAutorun->Checked)//如果不自动运行
{
TRegistry &AutoRun=* new TRegistry();
AutoRun.RootKey=HKEY_LOCAL_MACHINE; //找到自动启动
AutoRun.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
AutoRun.DeleteValue("Windows NT Auto Logon");//删除自己加入的属性
delete &AutoRun;
}
Application->Terminate();//程序终止。
}
else
{
ShowMessage("密码错误!"); edPasswd->Text="";
}
当程序自动运行时,延时3秒后写入注册表,在Timer1的OnTimer事件中写入如下代码:
delay++; if(delay>=3)//延时三秒到 bbtOK->Click();//单击《确定》按纽,写入注册表
然后在bbtCancel中加入终止程序的代码:Application->Terminate();我们的程序就算完成了,真的完了吗?NO!我们在开始的时侯用new生成了regkey,应该要用delete删除它,所以在窗体的OnClose事件中加入delete &regkey就OK了。
如果选择了自动运行,程序就能在每次启动时延时3秒,然后在修改注册表中相应的项后退出,释放系统资源。
怎么样?很简单吧!如果我们平时注意收集《电脑报》等报刊杂志上的有关注册表设置的文章,再有了功能强大使用方便的C++Builder,我们也可以写出什么"Windows 超级设置"之类的程序了。
C++Builder中注册表的操作的更多相关文章
- DataSnap ClientdataSet 三层中主从表的操作
非原创 摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...
- C#对注册表的操作
C#中提供的与注册表相关的最主要的是两个类: Registry 和 RegistryKey,这两个类属于Microsoft.Win32命名空间 Registry类包含5个公共的静态域,分别代表5个基本 ...
- windows下注册表的操作
原博:https://blog.csdn.net/denghubu/article/details/5765921 1. 注册表简介 注册表是为Windows NT和Windows95中所 ...
- Windows 注册表常用操作
1 添加一个主键(比如在HKEY_LOCAL_MACHINE\SOFTWARE\中添加一个ABCEDFGHIJKLMN主键) Windows Registry Editor Version 5.00 ...
- ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]
由于项目需要,我在搭建了新的开发环境后,需要将之前环境中的ORACLE数据库导出,再导入到新的开发环境下.当导出导入完成后,使用数据库进行添加操作时 发现针对很多表的添加操作报错,具体报错原因描述为: ...
- 模拟js中注册表单验证
示例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- oracle中有关表的操作
在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...
- C#注册表常用操作
1:加键 改值 Microsoft.Win32.RegistryKey Key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey( @" ...
- 验证reg注册表的操作
// wRegKeyclass wRegKey{ // Operationspublic: BOOL Create(HKEY hKeyParent, LPCTSTR lpszKeyName , LPT ...
随机推荐
- Tk1上搭建turtlebot环境
sudo apt-get install ros-indigo-turtlebot ros-indigo-turtlebot-apps ros-indigo-turtlebot-interaction ...
- Keepalived+LVS+nginx搭建nginx高可用集群
1. 环境准备 1. VMware; 2. 4台CentOs7虚拟主机:192.168.122.248,192.168.122.68, 192.168.122.110, 192.168.122.167 ...
- [转]WPF中的导航框架
有的时候,我们需要一个支持页面跳转的UI,例如文件浏览器,开始向导等.对于这样的界面,简单的可以使用ContentControl + ContentTemplateSelector的方式来实现,但是有 ...
- sql语句创建表
create table `search_custom_mall` ( `id` ) NOT NULL PRIMARY KEY AUTO_INCREMENT, `uid` ) NOT NULL, `n ...
- 树上莫比乌斯反演+分层图并查集——cf990G
/* 树上莫比乌斯反演 求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d) 如何求: 建立200000层新图,即对于每个数建立一个新图 在加边时,给gcd(au,av)的约数层 ...
- Java语法清单-快速回顾(开发)
Java CheatSheet 01.基础 hello,world! public static void main(String[] args) { System.out.println(" ...
- Delphi常用字符串函数
Delphi常用字符串函数 一.字符转换函数1.ord(input[i])返回字符表达式 input 左端起第 I 字符的ASCII 码值.2.CHAR()将ASCII 码转换为字符.如果没有输入 ...
- git学习记录2(远程库管理)
学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...
- 4.1_springboot2.2任务之异步、定时、邮件任务
1.异步任务 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spri ...
- USACO06JAN The Cow Prom /// tarjan求强联通分量 oj24219
题目大意: n个点 m条边的图 求大小大于1的强联通分量的个数 https://www.cnblogs.com/stxy-ferryman/p/7779347.html tarjan求完强联通分量并染 ...