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