程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi編程訪問注冊表

Delphi編程訪問注冊表

編輯:Delphi

注冊表是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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved