C Builder中注冊(cè)表的操作
C Builder中注冊(cè)表的操作操作就非常的簡(jiǎn)單了,下面我就以一個(gè)實(shí)例來說明TRegistry 類的用法。 首先,先介紹一下TRegistry 的屬性和方法: TRegistry 類一共有四個(gè)屬性
C Builder中注冊(cè)表的操作
操作就非常的簡(jiǎn)單了,下面我就以一個(gè)實(shí)例來說明TRegistry 類的用法。 首先,先介紹一下TRegistry 的屬性和方法: TRegistry 類一共有四個(gè)屬性。
屬性 類型 描述
CurrentKey int 包含當(dāng)前鍵值的值,但它的意思不太好懂,所以不太常用
當(dāng)前鍵值的根鍵,BCB 定義有枚舉常量:HKEY_CURRENT_USER、HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE、HKEY_USERS、RootKey int HKEY_CURRENT_CONFIG、HKEY_DYN_DATA 、HKEY_USERS。分別對(duì)應(yīng)注冊(cè)表中相應(yīng)的主鍵。生成一個(gè)TRegistry 類的實(shí)例時(shí)RootKye 缺省值為HKEY_CURRENT_USER
當(dāng)前鍵值的文本描述,HKEY_CURRENT_USERSoftwareBorlandAnsiStrin CurrentPath 的CurrentPath="SoftwareBorland",而g RootKey=HKEY_CURRENT_USER
值為true :只要關(guān)閉一個(gè)鍵,就立即返回應(yīng)用程序。值為false :必LazyWrite bool 須寫完注冊(cè)表后才返回。其缺省值為true 。 TRegistry 類的方法比較多,擇其常用的簡(jiǎn)要說明如下: 方法 描述
CloseKey() 關(guān)閉一個(gè)鍵值并向鍵值寫數(shù)據(jù),只要對(duì)鍵值操作完畢后就應(yīng)該關(guān)閉
它,不過你可以不必調(diào)用此方法,因?yàn)門Registry 的析構(gòu)函數(shù)會(huì)自動(dòng)調(diào)用它。
刪除鍵值,參數(shù)為要?jiǎng)h除的鍵值,如果參數(shù)為空字符串,則刪除當(dāng)DeleteKey(AnsiString) 前鍵值
OpenKey(Ansistring,bool打開一個(gè)鍵值,如果這個(gè)鍵值不存在,將由第二個(gè)參數(shù)決定是否自) 動(dòng)建立。
LoadKey(AnsiString,Ansi從文件裝入鍵值,第一個(gè)參數(shù)為鍵值,第二個(gè)參數(shù)為文件名 String)
KeyExists(AnsiString) 檢測(cè)一個(gè)鍵值是否存在。
SaveKey(AnsiString,Ansi把一個(gè)鍵值保存到文件,參數(shù)說明參見LoadKey() String)
讀出一個(gè)鍵值為整數(shù),如果失敗將拋出異常。同此函數(shù)類似的還有
ReadInteger(AnsiString) ReadBool()、ReadString()、ReadFloat()、ReadDateTome()、
ReadBinaryData()等,用來讀出不同類型的鍵值。
ValueExists(AnsiString) 檢測(cè)一個(gè)值是否存在。
寫一個(gè)鍵值為整數(shù),如果失敗將拋出異常。同此函數(shù)類似的還有WriteInteger(AnsiString,iWriteBool()、WriteString()、WriteFloat()、WriteDateTome()、nt) WriteBinaryData()等,用來寫入不同類型的鍵值。
利用TRegistry 是很容易的,一般來說,有以下四步操作:
1) 建立TRegistry 類
2) 利用OpenKey()方法打開一個(gè)鍵值
3) 用ReadType()和WriteType()讀寫鍵值
4) 調(diào)用CloseKey ()關(guān)閉一個(gè)鍵值。
,值得注意的是:在使用TRegistry 類時(shí),必須要加入此類的頭文件:#include
好了,說了那么多,也該舉一個(gè)實(shí)例來說明,下面我就以我的《WinNT 自動(dòng)登錄》來說明TRegistry 類的用法。
WinNT 的用戶都知道,WinNT 在啟動(dòng)時(shí)需要按Ctrl Alt Del登錄, 即便沒有密碼也是如此. 雖然WinNT 不會(huì)象 WIN9X 那樣經(jīng)常死機(jī), 但每次開機(jī)都要這樣還是有點(diǎn)煩. 能 不能讓W(xué)inNT 每次啟動(dòng)自動(dòng)登錄呢? 其實(shí)只要把注冊(cè)表的一 個(gè)屬性AutoAdminLogon 的值設(shè)置為"1" 即可, 可惜的是這 樣做只能管一次, 每次啟動(dòng)后WinNT 就會(huì)自動(dòng)把它的值改為 "0"(該死的Bill!). 如果每次都要修改注冊(cè)表, 還不如每次手動(dòng)登錄呢! 寫個(gè)程序在啟動(dòng)后自動(dòng)修改這個(gè)值就OK 了。
首先新建一個(gè)工程,在窗體放入4個(gè)文本框,分別命名為:dUser 、edPasswd 、edRePasswd 、edDomain 。分別用來輸入用戶名、登錄口令、重輸口令和域,把edPasswd 和edRePasswd 的PasswordChar 屬性改為"*"(密碼方式輸入) 。再加入2個(gè)復(fù)選框來選擇是否自動(dòng)登錄(chkAuto)和自動(dòng)運(yùn)行(chkAutorun),一個(gè)定時(shí)器(Timer1),2個(gè)按紐(bbtOK、bbtCancel) 和一些Label, 調(diào)整布局如下圖:
打開代碼窗口,在頭部輸入以下代碼:
#includeTRegistry ?key=* new TRegistry();//定義全局變量:注冊(cè)表類。 int delay=0;//定義全局變量,延時(shí)時(shí)間
然后選擇窗體的OnCreat 事件,輸入以下代碼:
regkey.RootKey=HKEY_LOCAL_MACHINE;//設(shè)置根鍵 //打開自動(dòng)登錄所在的鍵
regkey.OpenKey("SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon",true);
//以下3句打開Windows 自動(dòng)運(yùn)行的鍵值。 TRegistry &AutoRun=* new TRegistry(); AutoRun.RootKey=HKEY_LOCAL_MACHINE;
AutoRun.OpenKey("SOFTWAREMicrosoftWindowsCurrentVersionRun",true);
if(strlen(CmdLine)>Application->ExeName.Length() 3)//如果帶參數(shù)運(yùn)行則是要卸載 {
AutoRun.DeleteV alue("Windows NT Auto Logon");//刪除自己加入的屬性
,regkey.DeleteValue("Windows NT Auto Logon"); delete &AutoRun;
Application->Terminate();//終止應(yīng)用程序 return; } //把本程序?qū)懭胱詣?dòng)運(yùn)行。
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; //本程序是否自動(dòng)運(yùn)行
edPasswd->Text=regkey.ReadString("DefaultPasswd"); //讀出口令
setControl(!chkAutorun->Checked); //如果是自動(dòng)運(yùn)行狀態(tài)把其他屏蔽,反之亦然
if(chkAutorun->Checked)
{
Timer1->Enabled=true; //自動(dòng)運(yùn)行開始計(jì)時(shí) edRePasswd->Text=edPasswd->Text;
}
}
其中setControl()的功能是屏蔽幾個(gè)組件,定義如下:
首先在窗體的頭文件窗體類定義加入void setControl(bool);
其函數(shù)體如下(窗體名為fmMain) :
void TfmMain::setControl(bool t)
{
edUser->Enabled= t;
edRePasswd->Enabled= t;
edPasswd->Enabled= t;
edDomain->Enabled= t;
chkAuto->Enabled= t;
}
在chkAutoRun 的OnClick 事件中根據(jù)是否選擇了自動(dòng)運(yùn)行來決定是否啟動(dòng)定時(shí)器
setControl(!chkAutorun->Checked);//如果是自動(dòng)運(yùn)行狀態(tài)把其他屏蔽,反之亦然 if(!chkAutorun->Checked)
{
Timer1->Enabled=false;//如果不是自動(dòng)運(yùn)行,定時(shí)器失效 delay=0;
}
else
Timer1->Enabled=true;//否則定時(shí)器有效
在按紐bbtOK 的OnClick 事件中輸入以下代碼,其功能是寫入注冊(cè)表。
if(edRePasswd->Text==edPasswd->Text)//如果密碼正確
{
regkey.WriteString("DefaultDomainName",edDomain->Text);//寫入域名
regkey.WriteString("DefaultUserName",edUser->Text);//寫入用戶名
regkey.WriteString("AutoAdminLogon",chkAuto->Checked?"1":"0");//寫入是否自動(dòng)登錄
regkey.WriteString("Windows NT Auto Logon",chkAutorun->Checked?"1":"0");//寫入是否自動(dòng)運(yùn)行
regkey.WriteString("DefaultPasswd",edPasswd->Text);//寫入密碼
,if(!chkAutorun->Checked)//如果不自動(dòng)運(yùn)行
{
TRegistry &AutoRun=* new TRegistry();
AutoRun.RootKey=HKEY_LOCAL_MACHINE; //找到自動(dòng)啟動(dòng)
AutoRun.OpenKey("SOFTWAREMicrosoftWindowsCurrentVersionRun",true);
AutoRun.DeleteV alue("Windows NT Auto Logon");//刪除自己加入的屬性
delete &AutoRun;
}
Application->Terminate();//程序終止。
}
else
{
ShowMessage("密碼錯(cuò)誤!"); edPasswd->Text="";
}
當(dāng)程序自動(dòng)運(yùn)行時(shí),延時(shí)3秒后寫入注冊(cè)表,在Timer1的OnTimer 事件中寫入如下代碼: delay ; if(delay>=3)//延時(shí)三秒到 bbtOK->Click();//單擊《確定》按紐,寫入注冊(cè)表
然后在bbtCancel 中加入終止程序的代碼:Application->Terminate();我們的程序就算完成了,真的完了嗎?NO !我們?cè)陂_始的時(shí)侯用new 生成了regkey ,應(yīng)該要用delete 刪除它,所以在窗體的OnClose 事件中加入delete &regkey 就OK 了。
如果選擇了自動(dòng)運(yùn)行,程序就能在每次啟動(dòng)時(shí)延時(shí)3秒,然后在修改注冊(cè)表中相應(yīng)的項(xiàng)后退出,釋放系統(tǒng)資源。
怎么樣?很簡(jiǎn)單吧!如果我們平時(shí)注意收集《電腦報(bào)》等報(bào)刊雜志上的有關(guān)注冊(cè)表設(shè)置的文章,再有了功能強(qiáng)大使