首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 登錄表操作實戰:以「隱藏磁碟機」為例詳解讀寫技巧

     編輯:Delphi

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)。

TRegistry 常用方法速查

方法用途
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.

執行與驗證

  1. 編譯執行 Hide_Drive.exe。
  2. 勾選欲隱藏磁碟機,按「隱藏」。
  3. 登出 Windows 或重新啟動總管 (explorer.exe) 即可生效。

注意:修改 HKEY_LOCAL_MACHINE 需系統管理員權限 (Vista 以上以管理員身分執行)。

小結

「開啟鍵 → 讀/寫值 → 關閉鍵」是登錄表操作的鐵律。善用 try...finally 確保 Free 與 CloseKey 必被呼叫,避免資源洩漏。本範例邏輯可直接移植至 VC++、VB 等語言,只需對應其登錄表 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved