怎么获得某个健的‘所有’键值的名称和数据
用readstring只能读出一个指定名称的键值的内容。

解决方案 »

  1.   

    给一段代码你看看,他是由根键生成他的所有子键(N层),是个递归函数,采用深度优先遍历,把所有键名放到TreeView中
    //-------------------------------------------------------
    //--------------------由当前键生成子键---------------------------
    //-------------------------------------------------------
    procedure TForm1.Search(SelectedNode:TTreeNode;SonKeyName:String);
    var
        Reg: TRegistry;
        KeyInfo:TRegKeyInfo;
        i:integer;
        StringList:TStrings;
        TempNode:TTreeNode;
        KeyName:String;
    begin
        Reg := TRegistry.Create();
        if (SelectedNode.Text = 'HKEY_CLASSES_ROOT') Then
        begin
            Reg.RootKey := HKEY_CLASSES_ROOT;
            TheState := 1;
        end
        else if (SelectedNode.Text = 'HKEY_CURRENT_USER') Then
        begin
            Reg.RootKey := HKEY_CURRENT_USER;
            TheState := 2;
        end
        else if (SelectedNode.Text = 'HKEY_LOCAL_MACHINE') Then
        begin
            Reg.RootKey := HKEY_LOCAL_MACHINE;
            TheState := 3;
        end
        else if (SelectedNode.Text = 'HKEY_USERS') Then
        begin
            Reg.RootKey := HKEY_USERS;
            TheState := 4;
        end
        else if (SelectedNode.Text = 'HKEY_CURRENT_CONFIG') Then
        begin
            Reg.RootKey := HKEY_CURRENT_CONFIG;
            TheState := 5;
        end
        else
        begin
            if (TheState = 1) Then
                Reg.RootKey := HKEY_CLASSES_ROOT
            else if (TheState = 2) Then
                Reg.RootKey := HKEY_CURRENT_USER
            else if (TheState = 3) Then
                Reg.RootKey := HKEY_LOCAL_MACHINE
            else if (TheState = 4) Then
                Reg.RootKey := HKEY_USERS
            else
                Reg.RootKey := HKEY_CURRENT_CONFIG;
        end;
        KeyName := SonKeyName;
        if (Reg.OpenKeyReadOnly(KeyName) <> false) Then
        begin
            Reg.GetKeyInfo(KeyInfo);
            if (KeyInfo.NumSubKeys > 0) Then
            begin
                if (SelectedNode.HasChildren = false) Then
                begin
                    StringList := TStringList.Create;
                    Reg.GetKeyNames(StringList);
                    if StringList.count>0 Then
                    begin
                        for i:=0 to StringList.Count-1 do
                            TreeView1.Items.AddChild(SelectedNode,StringList.Strings[i]);
                        for i:=0 to StringList.Count-1 do
                        begin
                            if (i = 0) then
                                TempNode := SelectedNOde.GetLastChild
                            else if (i <> StringList.Count-1) Then
                            begin
                                TempNode := SelectedNode.GetPrevChild(TempNode);
                            end
                            else
                                TempNode := SelectedNode.getFirstChild;
                            Search(TempNode,KeyName+StringList.Strings[StringList.Count-1-i]+'\');
                        end;
                    end;
                end;
            end;
        end;end;
      

  2.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      reg:TRegistry;
      str:TStrings;
      i,j:integer;
      keyname,keyvalue:string;
      he:HKEY;
    begin
      reg:=TRegistry.Create;
      reg.RootKey:=HKEY_CURRENT_USER;
      reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\run',false);
      reg.GetValueNames(form1.ListBox1.Items);
      i:=form1.ListBox1.Items.Count;
      if i>0 then
      begin
        for j:=0 to i-1 do
        begin
          keyname:=form1.ListBox1.Items.Strings[j];
          keyvalue:=reg.ReadString(keyname);
          showmessage(keyname+'   '+keyvalue);
        end;
      end;
      reg.Free;
    end;