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