Delphi 向TreeView发送备忘录行

Delphi 向TreeView发送备忘录行,delphi,treeview,tmemo,Delphi,Treeview,Tmemo,晚安,朋友们 我目前正在从事一个项目,该项目涉及可见窗口及其子代(也可见)的枚举 我可以一个接一个地传输TreeView的所有节点以获得备忘录(文本格式),但现在我正试图做相反的事情(这是项目的必要性) 有人能在这里帮我吗 下面是列出TreeView上的窗口的所有代码,并将其传输到一个备忘录中 function GetWindowTitle(hwnd: HWND): string; begin SetLength(Result, 255); SetL

晚安,朋友们

我目前正在从事一个项目,该项目涉及可见窗口及其子代(也可见)的枚举

我可以一个接一个地传输TreeView的所有节点以获得备忘录(文本格式),但现在我正试图做相反的事情(这是项目的必要性)

有人能在这里帮我吗

下面是列出TreeView上的窗口的所有代码,并将其传输到一个备忘录中

    function GetWindowTitle(hwnd: HWND): string; 
    begin 
      SetLength(Result, 255); 
      SetLength(Result, GetWindowText(hwnd, PChar(Result), 255)); 
    end; 

    function GetWindowClass(hwnd: HWND): string; 
    begin 
      SetLength(Result, 255); 
      SetLength(Result, GetClassName(hwnd, PChar(Result), 255)); 
    end; 

    function GetWindowInfo(hwnd: HWND): string; 
    begin 
      Result := GetWindowTitle(hwnd) + ' [' + GetWindowClass(hwnd) + 
        '] (' + {IntToStr}IntToHex(hwnd, 8) + ')'; 
    end; 

    function EnumChildProc(hwnd: HWND; lParam: Integer): BOOL; stdcall; 
    var 
      NewNode, ParentNode: TTreeNode; 
    begin 
      Result := True; 
      ParentNode := TTreeNode(lParam); 

      if IsWindowVisible(hwnd) then 

      NewNode := ParentNode.Owner.AddChild(ParentNode, 
        GetWindowInfo(hwnd)); 
      EnumChildWindows(hwnd, @EnumChildProc, Integer(NewNode)); 
    end; 

    function EnumWindowsProc(hwnd: HWND; lParam: Integer): BOOL; stdcall; 
    var 
      NewNode: TTreeNode; 
    begin 
      Result := True; 
      if IsWindowVisible(hwnd) then 
      NewNode := TTreeView(lParam).Items.Add(nil, GetWindowInfo(hwnd)); 
      EnumChildWindows(hwnd, @EnumChildProc, Integer(NewNode)); 
    end; 

    procedure EnumWindowsTree(Tree: TTreeView); 
    begin 
      EnumWindows(@EnumWindowsProc, Integer(Tree)); 
    end; 

    // Listing all windows in TreeView

    procedure TForm2.Button1Click(Sender: TObject); 
    begin 
    TreeView1.Items.Clear; 
    EnumWindowsTree(TreeView1); 
    end; 

   //Tranfers all nodes of TreeView for a Memo (one by one)

    procedure TForm2.Button3Click(Sender: TObject); 
    var I,P,Cnt : Integer; 
        ParentNode, ChildNode: TTreeNode; 
    begin 
       P   := 65; 
       ParentNode  :=  TreeView1.Items[0]; 
       While ParentNode<>nil do 
       begin 
         if (ParentNode <> nil) then 
         begin 
              Memo1.Lines.Add(ParentNode.Text); 
             Cnt := 1; 
             ChildNode := ParentNode.GetFirstChild; 
             while (ChildNode <> nil) do 
             begin 
               Memo1.Lines.Add(ChildNode.Text); 

               if ChildNode.HasChildren then 
               begin 
                  ParentNode:= ChildNode.GetFirstChild; 
                  break; 
               end; 
               ChildNode := ChildNode.GetNextSibling; 
               Inc(Cnt); 
             end; 
         end; 
         if ChildNode=nil then 
         begin 
           if ParentNode.GetNextSibling<>nil then 
              ParentNode:=ParentNode.GetNextSibling 
           else 
           begin 
              while ParentNode.GetNextSibling=nil do 
              begin 
                 if ParentNode.Parent<>nil then ParentNode:=ParentNode.Parent else break; 
              end; 
              if ParentNode<>nil then ParentNode:=ParentNode.GetNextSibling; 
           end; 
         end; 
         Inc(P); 
       end; 
    end; 
函数GetWindowTitle(hwnd:hwnd):字符串; 开始 SetLength(结果为255); SetLength(结果,GetWindowText(hwnd,PChar(结果),255)); 结束; 函数GetWindowClass(hwnd:hwnd):字符串; 开始 SetLength(结果为255); SetLength(结果,GetClassName(hwnd,PChar(结果),255)); 结束; 函数GetWindowInfo(hwnd:hwnd):字符串; 开始 结果:=GetWindowTitle(hwnd)+'['+GetWindowClass(hwnd)+ ']('+{IntToStr}IntToHex(hwnd,8)+'); 结束; 函数EnumChildProc(hwnd:hwnd;lParam:Integer):BOOL;stdcall; 变量 NewNode,ParentNode:TTreeNode; 开始 结果:=真; ParentNode:=TTreeNode(lParam); 如果IsWindowVisible(hwnd),则 NewNode:=ParentNode.Owner.AddChild(ParentNode, GetWindowInfo(hwnd)); EnumChildWindows(hwnd,@EnumChildProc,Integer(NewNode)); 结束; 函数EnumWindowsProc(hwnd:hwnd;lParam:Integer):BOOL;stdcall; 变量 NewNode:TTreeNode; 开始 结果:=真; 如果IsWindowVisible(hwnd),则 NewNode:=TTreeView(lParam).Items.Add(nil,GetWindowInfo(hwnd)); EnumChildWindows(hwnd,@EnumChildProc,Integer(NewNode)); 结束; 过程枚举WindowsTree(树:TTreeView); 开始 EnumWindows(@EnumWindowsProc,整数(树)); 结束; //在TreeView中列出所有窗口 程序TForm2.按钮1单击(发件人:ToObject); 开始 TreeView1.Items.Clear; EnumWindowsTree(TreeView1); 结束; //为备忘录传输TreeView的所有节点(逐个) 程序TForm2.按钮3点击(发送方:TObject); 变量I,P,Cnt:整数; ParentNode,ChildNode:t绿色节点; 开始 P:=65; ParentNode:=TreeView1.Items[0]; 而诺德尼呢 开始 如果(ParentNode nil),则 开始 Memo1.Lines.Add(ParentNode.Text); Cnt:=1; ChildNode:=ParentNode.GetFirstChild; 而(ChildNode nil)do 开始 Memo1.Lines.Add(ChildNode.Text); 如果ChildNode.HasChildren,则 开始 ParentNode:=ChildNode.GetFirstChild; 打破 结束; ChildNode:=ChildNode.GetNextSibling; 公司(Cnt),; 结束; 结束; 如果ChildNode=nil,则 开始 如果ParentNode.GetNextSiblingnil,则 ParentNode:=ParentNode.GetNextSibling 其他的 开始 而ParentNode.GetNextSibling=nil do 开始 如果ParentNode.Parentnil,则ParentNode:=ParentNode.ParentElse中断; 结束; 如果为ParentNodeInil,则ParentNode:=ParentNode.GetNextSibling; 结束; 结束; 公司(P),; 结束; 结束;
最好使用内置的TreeView内容存储方法:

// Tranfers all nodes of TreeView for a Memo (one by one)
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    TreeView1.SaveToStream(MS);
    MS.Position := 0;
    Memo1.Lines.LoadFromStream(MS);
  finally
    Ms.Free;
  end;
end;

// Tranfers all nodes to TreeView from a Memo
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    Memo1.Lines.SaveToStream(MS);
    MS.Position := 0;
    TreeView1.LoadFromStream(MS);
  finally
    Ms.Free;
  end;
end;
请注意,未命名的windows会中断正确还原所需的格式设置,因此我稍微更改了字符串格式:。“而不是空格

function GetWindowInfo(hwnd: HWND): string;
begin
  Result := GetWindowTitle(hwnd) + '.[' + GetWindowClass(hwnd) + '] (' +
  { IntToStr } IntToHex(hwnd, 8) + ')';
end;

将备忘录的行循环并添加到树状视图中?您的问题是什么?