Windows 登錄表是系統與應用程式設定的核心資料庫。掌握程式化讀寫登錄表,不僅能開發系統調校工具 (如「超級兔子」),更是 Delphi 開發者的基本功。本文以「隱藏 A/B 磁碟機」為實例,完整示範 TRegistry 的開啟、讀取、寫入、關閉標準流程。
鍵值位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer
值名稱:NoDrives (DWORD, 32 位元)
位元對應:第 0 位 = A 槽、第 1 位 = B 槽 … 第 25 位 = Z 槽。
範例:隱藏 A → 值 1 (二進位 0001);隱藏 B → 值 2 (0010);同時隱藏 A+B → 值 3 (0011)。
| 方法 | 用途 |
|---|---|
OpenKey(Key: string; CanCreate: Boolean): Boolean | 開啟指定鍵,CanCreate=True 時不存在則建立 |
WriteInteger(Name: string; Value: Integer) | 寫入整數值 (DWORD) |
ReadInteger(Name: string): Integer | 讀取整數值 |
ValueExists(Name: string): Boolean | 檢查值是否存在 |
CloseKey | 關閉目前開啟的鍵 |
TCheckBox:A_Check (A 槽)、B_Check (B 槽)TBitBtn:全選、取消、隱藏TGroupBox 包裝核取方塊procedure TForm1.Bit_hideClick(Sender: TObject);
var
myreg: TRegistry;
temp1, temp2, myval: Integer;
begin
temp1 := 0; temp2 := 0; myval := 0;
myreg := TRegistry.Create;
try
myreg.RootKey := HKEY_LOCAL_MACHINE;
if myreg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer', True) then
begin
if A_Check.Checked then temp1 := 1; // 第 0 位
if B_Check.Checked then temp2 := 2; // 第 1 位
myval := temp1 + temp2;
myreg.WriteInteger('NoDrives', myval);
myreg.CloseKey;
end;
finally
myreg.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
myreg: TRegistry;
begin
myreg := TRegistry.Create;
try
myreg.RootKey := HKEY_LOCAL_MACHINE;
if myreg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer', True)
and myreg.ValueExists('NoDrives') then
begin
case myreg.ReadInteger('NoDrives') of
1: A_Check.Checked := True;
2: B_Check.Checked := True;
3: begin A_Check.Checked := True; B_Check.Checked := True; end;
end;
myreg.CloseKey;
end;
finally
myreg.Free;
end;
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, 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
if A_Check.Checked then temp1:=1;
if B_Check.Checked then temp2:=2;
myval:=temp1+temp2;
WriteInteger('NoDrives',myval);
CloseKey;
end;
end;
myreg.Free;
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;
CloseKey;
end;
end;
myreg.Free;
end;
end.
Hide_Drive.exe。explorer.exe) 即可生效。注意:修改 HKEY_LOCAL_MACHINE 需系統管理員權限 (Vista 以上以管理員身分執行)。
「開啟鍵 → 讀/寫值 → 關閉鍵」是登錄表操作的鐵律。善用 try...finally 確保 Free 與 CloseKey 必被呼叫,避免資源洩漏。本範例邏輯可直接移植至 VC++、VB 等語言,只需對應其登錄表 API。