注冊表是windows系統的一個龐大數據庫,它存儲著系統硬件、軟件及用戶信息。適當修改注冊表的參數值,可以提高系統的性能。注冊表的修改通常有兩種途徑:其一是利用windows系統提供的"RegEdit"命令進行修改。此種方法雖說直觀,但由於注冊表的復雜性,對於一般用戶來說,此方法並不十分可行。其二就是以編程方式來訪問注冊表。掌握這種方法,對於程序員來說,是一個重要的基本技術。因為在我們的編程過程中,很多地方都需要以程序方式去訪問注冊表。比如大家熟悉的"超級兔子"、"俠客修改器"等,都是以這種方式來完成對注冊表的修改,從而達到保護系統或提高系統性能的目的。
下面以一個實例為基礎,講解在DelPhi中如何以編程方式對注冊表進行修改。通過本文的學習,你可以獲得以下知識:
第一、明確編程訪問注冊表的基本思想;
第二、明確如何在程序中完成對注冊表的讀寫操作;
第三、你可以將本文所述的方法移植到VC、VB等語言中,舉一反三、觸類旁通,達到隨心所欲修改注冊表的目的。
通過實踐,你完全有可能編寫出象"超級兔子"那樣的系統修改器。
一、 實例敘述
1、 程序名稱:"隱藏驅動器"(Hide_Drive.exe)
2、 程序界面:程序運行時的界面如圖一所示
3、 功能說明:
(1)用戶可以選擇"A驅"或"B驅",或同時選擇"A驅"和"B驅",單擊"隱藏"按鈕,即可以隱藏"我的電腦"中的軟盤驅動器。
(2)當程序啟動時,可判斷系統中軟盤的當前狀態。如果你的系統中軟盤B已經是處於隱藏狀態,程序啟動時的界面則如圖二所示。
4、 特別說明:此程序就是典型的對注冊表進行讀和寫的操作。
二、 編程思想
(一)、注冊表中隱藏驅動器的原理
1、在DOS、WIN9X/NT中,驅動器是用字母A-Z表示。其中A和B表示軟盤驅動器,C到Z則表示硬盤或網絡驅動器。也就是說,總共可以支持26個驅動器。
2、在注冊表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer下新建或修改DWORD類型的NoDrives的值,可以隱藏或顯示驅動器圖標。從而達到本程序的目的。
3、NoDrives的取值特點
NoDrives是4字節共32位的鍵值。從第0位到第31位的取值,就分別控制著驅動器A到Z的狀態。若第0位取值為1,則將隱藏驅動器A;若第1位為0,則顯示驅動器B,如此類推即可。如圖三所示:
(二)、DelPhi中對注冊表的讀寫過程簡介
在DelPhi中為程序員提供了一個Tregistry類,它提供了眾多豐富的方法來完成對注冊表的修改。限於篇幅,下面只針對本實例中所用到的讀寫注冊表的方法進行簡介:
(1)打開一個鍵:OpenKey();
function OpenKey(const Key: String; CanCreate: Boolean): Boolean;
(2)向一個鍵中寫入整型數據:WriteInteger();
procedure WriteInteger(const Name: string; Value: Integer);
(3)讀取一個鍵中某個具體的整型數值:ReadInteger();
function ReadInteger(const Name: String): Integer;
(4)判斷某一鍵值是否存在:ValueExists();
function ValueExists(const Name: string): Boolean;
(5)關閉一個鍵:CloseKey;
procedure CloseKey;
(三)、設計方法(分為注冊表的讀寫兩部分)
1、"隱藏"按鈕中代碼的設計思想(注冊表的寫操作)
(1)、當用戶單擊"隱藏"按鈕時,就利用OpenKey方法打開注冊表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer,判斷其下是否存在"NoDrives"鍵。若此鍵不存在,就自動建立它。然後,根據用戶選擇的選擇修改"NoDrives"的值。用戶的選擇和NoDrives的值對應關系如下:
用戶選擇"A驅",則NoDrives的值為:1;
用戶選擇"B驅",則NoDrives的值為:2;
用戶同時選擇"A驅"和"B驅",則NoDrives的值為:3;
(2)、根據用戶的選擇,利用方法WriteInteger(),將NoDrives的值寫入注冊表;
(3)、利用CloseKey關閉打開的主鍵。
2、(注冊表的讀操作)為了實現程序啟動時能自動判斷系統驅動器的當前狀態,還要在Form1的FormCreate()方法中利用ReadInteger()和ValueExists()讀取注冊表中NoDrives的值。然後根據讀出的NoDrives的值設置窗體上兩個復選的選擇狀態。NoDrives的值與復選框的狀態對應關系如下:
NoDrives的值為1,則窗體上"A驅"復選框處於選中狀態;
NoDrives的值為2,則窗體上"B驅"復選框處於選中狀態;
NoDrives的值為3,則窗體上"A驅"和"B驅"復選框同時處於選中狀態;
三、設計過程
(一)、界面的建立
1、啟動DelPhi5,新建一個窗體Form1;
2、在窗體Form1上建立三個TbitBtn按鈕、兩個復選框TcheckBox、一個GroupBox1,調整各對象的位置,使其與圖一所示。
(二) 、代碼編輯
1、要使程序能夠正確訪問注冊表,必須在單元文件unit Unit1的interface的 uses中增加注冊表類:Registry。此句千萬不能少。
2、按鈕Bit_all("全選"按鈕)中的代碼如下:
procedure TForm1.Bit_allClick(Sender: TObject);
begin
A_check.Checked:=true;
B_check.Checked:=true;
end; //當用戶單擊"全選"按鈕時,將兩個復選框都設為選中狀態。
3、按鈕Bit_cancel("取消"按鈕)中的代碼如下:
procedure TForm1.Bit_cancelClick(Sender: TObject);
begin
A_check.Checked:=false;
B_check.Checked:=false;
end; //當用戶單擊"取消"按鈕時,則取消復選框的選中狀態。
4、按鈕Bit_hide("隱藏"按鈕)中的代碼如下(主要程序代碼均放在這裡,當用戶按此按鈕時,即完成隱藏驅動器的目的):
procedure TForm1.Bit_hideClick(Sender: TObject);
var myreg:TRegistry; // 定義Tregistry型變量myreg
temp1,temp2,myval:integer;//temp1和temp2分別保存復選框A_check和B_check的值;
//myval用於保存寫入注冊表的最終值,它等於temp1和temp2的和。
begin
temp1:=0;
temp2:=0;
myval:=0; //初始三個變量。
myreg:=TRegistry.Create;//利用Tregistry的Create方法創建一個實例myreg。
with myreg do
begin
rootkey:=HKEY_LOCAL_MACHINE;//確定打開注冊表的主鍵。
if openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer',true) then
begin //打開NoDrives所在的鍵。
case form1.A_Check.Checked of
true:
temp1:=1;//當用戶點擊"A驅"復選框時,將臨時變量temp1置1。
end;
case form1.B_Check.Checked of
true:
temp2:=2; //當用戶點擊"B驅"復選框時,將臨時變量temp2置2。
end;
myval:=temp1+temp2;//將臨時變量temp1和temp2中的值求和賦給myval。因為用戶可,
//能選中兩個復選框,此時寫入注冊表的值應為1+2,所以用temp1與temp2的和賦給myval。
WriteInteger('NoDrives',myval);//利用函數創建一個Dword值"NoDrives",其值為myval
//並寫入注冊表。
myreg.CloseKey;//關閉前面打開的主鍵,完成隱藏操作。
myreg.Free;
end;
end;
end;
5、為了實現程序啟動時能自動判斷系統驅動器的當前狀態,還要在Form1的FormCreate()方法中利用ReadInteger()和ValueExists()讀取注冊表中NoDrives的值。然後根據讀出的NoDrives的值設置窗體上兩個復選的選擇狀態。程序如下:
procedure TForm1.FormCreate(Sender: TObject);
var myreg:TRegistry;
begin
myreg:=TRegistry.Create;
with myreg do
begin
rootkey:=HKEY_LOCAL_MACHINE;
if openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer',true) and ValueExists('NoDrives') then //如果打開鍵成功且NoDrives存在,則進行下面操作。
begin
if readinteger('NoDrives')=1 then //讀取NoDrives的值,若為1,則將A_check設為選中。
A_check.Checked:=true;
if readinteger('NoDrives')=2 then//讀取NoDrives的值,若為2,則將B_check設為選中。
B_check.Checked:=true;
if readinteger('NoDrives')=3 then//讀取NoDrives的值,若為3,則將兩個復選框均選中。
begin
A_check.Checked:=true;
B_check.Checked:=true;
end;
myreg.CloseKey;
myreg.Free;
end;
end;
end;
6、將以上程序保存為Hide_drive,然後編譯成可執行程序Hide_Drive.exe即可。此程序在Win2000和Delphi5中運行通過。操作時隱藏了驅動器,請重新注銷windows即可看到實際效果。
四、結束語
在程序中訪問注冊表的基本方法是:打開注冊表、讀寫注冊表、關閉打開的主鍵。此實例程序本身雖然比較簡單,但其訪問注冊表的方法卻比較通用,你可以將此方法靈活運用到其他程序語言中,設計出滿足要求的實用程序。其實在DelPhi中,Tregistry類為我們提供了更多更豐富的方法來操作注冊表,但操作的方法仍然是一樣的,希望通過本文的實例,能為廣大Delphi愛好者或程序設計愛好者提供一點幫助。
附:為了使大家能對此程序有一個完整的了解,下面附上源程序,請大家指教!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons,Registry; // 此處加上Registry,才能使程序訪問注冊表
type
TForm1 = class(TForm)
A_Check: TCheckBox;
B_Check: TCheckBox;
Bit_all: TBitBtn;
Bit_cancel: TBitBtn;
Bit_hide: TBitBtn;
GroupBox1: TGroupBox;
procedure Bit_allClick(Sender: TObject);
procedure Bit_cancelClick(Sender: TObject);
procedure Bit_hideClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Bit_allClick(Sender: TObject);
begin
a_check.Checked:=true;
b_check.Checked:=true;
end;
procedure TForm1.Bit_cancelClick(Sender: TObject);
begin
a_check.Checked:=false;
b_check.Checked:=false;
end;
procedure TForm1.Bit_hideClick(Sender: TObject);
var myreg:TRegistry;
temp1,temp2,myval:integer;
begin
temp1:=0;
temp2:=0;
myval:=0;
myreg:=TRegistry.Create;
with myreg do
begin
rootkey:=HKEY_LOCAL_MACHINE;
if openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer',true) then
begin
case form1.A_Check.Checked of
true:
temp1:=1;
end;
case form1.B_Check.Checked of
true:
temp2:=2;
end;
myval:=temp1+temp2;
WriteInteger('NoDrives',myval);
myreg.CloseKey;
myreg.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var myreg:TRegistry;
begin
myreg:=TRegistry.Create;
with myreg do
begin
rootkey:=HKEY_LOCAL_MACHINE;
if openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\explorer',true) and ValueExists('NoDrives') then
begin
if readinteger('NoDrives')=1 then
A_check.Checked:=true;
if readinteger('NoDrives')=2 then
B_check.Checked:=true;
if readinteger('NoDrives')=3 then
begin
A_check.Checked:=true;
B_check.Checked:=true;
end;
myreg.CloseKey;
myreg.Free;
end;
end;
end;
end.