Chcę wypisać listę kluczy z rejestru tak jak to robi JV16 PowerTools, tzn.:

  • wypisać listę programów z klucza HKEY_CURRENT_USER\Software\ łącznie z pierwszym podkluczem.

Wygląda to tak:

user image
Jak widać wpisów Gadu-Gadu poniższy przykład znalazł jeden, podczas gdy JV16 trzy (bo szukał także w podkluczu Gadu-Gadu)

Poniższej zamieszczam przykład, który wypisuje jedynie listę bez jeszcze jednego podklucza i ignoruje następujące wpisy systemowe:
Adaptec
Canon
Classes
Install
Intel
Microsoft
Policies
Vision
z pliku ignoruj.dat

var
 Klucz, Ignor : TStringList;
 item  : TLIstItem;
 j, i, nr, zignorowano : integer;
 Reg: TRegistry;
begin
  nr := 1;
  zignorowano := 0;
  ListView.Clear;

  Reg   := TRegistry.Create;
  Klucz := TStringList.Create;
  Ignor := TStringList.Create;

  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey('Software\', True);
  Reg.GetKeyNames(Klucz);
  Ignor.LoadFromFile(ExtractFilePath(Application.ExeName) + 'ignoruj.dat');
  
  for i := 0 to Klucz.Count-1 do
    begin
     for j := Ignor.Count-1 downto 0 do
       if Klucz.Strings[i] = Ignor.Strings[j] then
         begin
          Item            := ListView.Items.Add;
          Item.Caption    := Klucz.Strings[i] + '    (nie usuwaj !)';
          Item.ImageIndex := -1;
          Item.StateIndex := 1;
          Item.SubItems.Add('\Software\' + Klucz.Strings[i]);
          Inc(zignorowano);
          nr := 0;
          Break;
         end
       else nr := 1;

     if nr = 1 then
       begin
        Item            := ListView.Items.Add;
        Item.Caption    := Klucz.Strings[i];
        Item.ImageIndex := -1;
        Item.StateIndex := 2;
        Item.SubItems.Add('\Software\' + Klucz.Strings[i]);
       end;
    end;

  Reg.CloseKey;
  Reg.Free;
  Klucz.Free;
  Ignor.Free;
  Ignorowane.Caption := 'Zignorowano: ' + inttostr(zignorowano);
end;

Proszę o modyfikacje przykładu. [soczek]

//dopisane...
Udało mi się, własnymi siłami dotrzeć do mety... oto wynik, może komuś się przyda w przyszłości...:

var
 Klucz1, Klucz2, Ignor : TStringList;
 item  : TLIstItem;
 j, i, k, nr, ign : integer;
 Reg: TRegistry;
begin
  nr  := 1;
  ign := 0;
  ListView.Clear;

  Reg    := TRegistry.Create;
  Klucz1 := TStringList.Create;
  Klucz2 := TStringList.Create;
  Ignor  := TStringList.Create;

  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey('Software\', True);
  Reg.GetKeyNames(Klucz1);
  Reg.CloseKey;

  for i := 0 to Klucz1.Count-1 do
    begin
     for j := Ignor.Count-1 downto 0 do
       if Klucz1.Strings[i] = Ignor.Strings[j] then
         begin
          Item            := ListView.Items.Add;
          Item.Caption    := Klucz1.Strings[i];
          Item.ImageIndex := -1;
          Item.StateIndex := 1;
          Item.SubItems.Add(Klucz1.Strings[i]);
          Inc(ign);
          nr := 0;
          Break;
         end
       else nr := 1;

     if nr = 1 then
       begin
        Application.ProcessMessages;
        Reg.OpenKey('Software\' + Klucz1.Strings[i], True);
        Reg.GetKeyNames(Klucz2);
        Reg.CloseKey;
        if Klucz2.Count > 0 then
          begin
           for k := 0 to Klucz2.Count-1 do
             begin
              Item            := ListView.Items.Add;
              Item.Caption    := Klucz1.Strings[i];
              Item.ImageIndex := -1;
              Item.StateIndex := 2;
              Item.SubItems.Add(Klucz2.Strings[k]);
             end;
          end
        else
          begin
           Item            := ListView.Items.Add;
           Item.Caption    := Klucz1.Strings[i];
           Item.ImageIndex := -1;
           Item.StateIndex := 0;
           Item.SubItems.Add(Klucz1.Strings[i]);
          end;
       end;
    end;
  Reg.CloseKey;
  Reg.Free;
  Klucz1.Free;
  Klucz2.Free;
  Ignor.Free;
  Label1.Caption := 'Zignorowano: ' + inttostr(ign);
end;