Перечислить измененные ключи реестра в определенный диапазон времени

Previous  Top  Next

    
 

 

Code:

unit Main;

 

interface

 

uses

  Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Registry, StdCtrls, ComCtrls, ExtCtrls;

 

type

  TFrmMain = class(TForm)

    Memo1: TMemo;

    btEnumReg: TButton;

    dtBeginDate: TDateTimePicker;

    dtEndDate: TDateTimePicker;

    dtBeginTime: TDateTimePicker;

    dtEndTime: TDateTimePicker;

    Panel1: TPanel;

    Label1: TLabel;

    Label2: TLabel;

    procedure btEnumRegClick(Sender: TObject);

  private

    { Private declarations }

    RegDate: TDateTime;

    RegKeyInfo: TRegKeyInfo;

    TimeZoneInfo: TTimeZoneInformation;

    function DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime;

    procedure FileTimeToDateTime(ft: TFileTime; var dt: TDateTime);

  public

    { Public declarations }

 

  end;

 

var

  FrmMain: TFrmMain;

 

implementation

 

{$R *.dfm}

 

function TFrmMain.DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime;

begin

  case GetTimeZoneInformation(TimeZoneInfo) of

    TIME_ZONE_ID_STANDARD:

      Result := DateTime - (TimeZoneInfo.Bias / 60 / 24);

    TIME_ZONE_ID_DAYLIGHT:

      Result := DateTime - ((TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / 60 / 24);

    else

      Result := 0;

  end;

end;

 

procedure TFrmMain.FileTimeToDateTime(ft: TFileTime; var dt: TDateTime);

var

  SystemTime: TSystemTime;

  FileTime: TFileTime;

begin

  if FileTimeToLocalFileTime(ft, FileTime) then

  begin

    FileTimeToSystemTime(ft, SystemTime);

    dt := SystemTimeToDateTime(SystemTime);

  end;

end;

 

procedure TFrmMain.btEnumRegClick(Sender: TObject);

var

  Inizio, Fine: TDateTime;

 

  procedure EnumAllKeys(hkey: THandle; KeyName: string);

  var

    l: TStringList;

    n: Integer;

    KeyName_: string;

  begin

    KeyName_ := KeyName;

    with TRegistry.Create do

      try

        RootKey := hkey;

        OpenKey(EmptyStr, False);

        l := TStringList.Create;

        try

          GetKeynames(l);

          CloseKey;

          for n := 0 to l.Count - 1 do

          begin

            if OpenKey(l[n], False) then

            begin

              GetKeyInfo(RegKeyInfo);

              with RegKeyInfo do

              begin

                FileTimeToDateTime(FileTime, RegDate);

                RegDate := DateTimeToLocalDateTime(RegDate);

              end;

              if (RegDate <= Fine) and (RegDate >= Inizio) then

                memo1.Lines.Add(DateTimeToStr(RegDate) + ' --- ' + KeyName_ + '\' + l[n]);

              EnumAllKeys(CurrentKey, KeyName_ + '\' + l[n]);

              CloseKey;

            end;

          end;

        finally

          l.Free

        end;

      finally

        Free;

      end;

  end;

begin

  Memo1.Clear;

  Memo1.Lines.BeginUpdate;

  Inizio := int(dtBeginDate.DateTime) + frac(dtBeginTime.DateTime);

  Fine   := int(dtEndDate.Date) + frac(dtEndTime.DateTime);

  try

    EnumAllKeys(HKEY_CURRENT_USER, 'HKey_Current_User');

  finally

    Memo1.Lines.EndUpdate;

  end;

 

  MessageDlg('Enumeration ended', mtInformation, [mbOK], 0);

end;

 

end.

 

 

©Drkb::02286

Взято с сайта: http://www.swissdelphicenter.ch