1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| procedure TFrm_Tueur_de_processus.GenererArbre(HandleArbre: THandle);
function GetClassAndCaption(aHandle: THandle): string;
var
lpRes : array[0..256] of Char;
StrClass: string;
StrCaption: string;
begin
GetClassName(aHandle, lpRes, SizeOf(lpRes));
StrClass := lpRes;
GetWindowText(aHandle, lpRes, SizeOf(lpRes));
StrCaption := lpRes;
Result := Format('%s : "%s" (%d)', [StrClass, StrCaption, aHandle])
end;
function GetWindowList(HandleStart: THandle; RelationStart: Cardinal; RelationDirection: Cardinal = GW_HWNDNEXT): TStringList;
var
HandleFound: THandle;
begin
Result := TStringList.Create();
HandleFound := GetWindow(HandleStart, RelationStart);
repeat
if (HandleFound <> 0) and (HandleFound <> HandleStart) then
begin
Result.AddObject(GetClassAndCaption(HandleFound), Pointer(HandleFound));
end;
HandleFound := GetWindow(HandleFound, RelationDirection);
until (HandleFound = 0);
end;
function GetFreres(HandleFrere: THandle): TStringList;
begin
Result := GetWindowList(HandleFrere, GW_HWNDFIRST);
end;
function GetEnfants(HandleParent: THandle): TStringList;
begin
Result := GetWindowList(HandleParent, GW_CHILD);
end;
function GetParents(HandleEnfant: THandle): TStringList;
begin
Result := GetWindowList(HandleEnfant, GW_OWNER, GW_OWNER);
end;
procedure ArbreEnfant(Tree: TTreeNodes; Node: TTreeNode; HandleParent: THandle);
var
EnfantsList: TStringList;
IndexEnfant: Integer;
NewNode: TTreeNode;
begin
EnfantsList := GetEnfants(HandleParent);
try
EnfantsList.Sort();
for IndexEnfant := 0 to EnfantsList.Count-1 do
begin
NewNode := Tree.AddChildObject(Node, EnfantsList.Strings[IndexEnfant], EnfantsList.Objects[IndexEnfant]);
ArbreEnfant(Tree, NewNode, THandle(EnfantsList.Objects[IndexEnfant]));
end;
finally
EnfantsList.Free();
end;
end;
function SameParent(ParentHandle, HandleFrere: THandle): Boolean;
var
ParentList: TStringList;
begin
Result := False;
ParentList := GetParents(HandleFrere);
try
if ParentList.Count > 0 then
Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
finally
ParentList.Free();
end;
end;
var
ParentList, FreresList: TStringList;
IndexParent, IndexFrere: Integer;
ItemSelectNode, ParentNode, FrereNode, VoisinNode, Node: TTreeNode;
HandleTopParent: THandle;
begin
HandleTopParent := 0;
TreeView3.Items.BeginUpdate();
try
TreeView3.Items.Clear();
ItemSelectNode := TreeView3.Items.Add(nil, 'Element Sélectionné');
Node := TreeView3.Items.AddChildObject(ItemSelectNode, GetClassAndCaption(HandleArbre), Pointer(HandleArbre));
ArbreEnfant(TreeView3.Items, Node, HandleArbre);
ParentNode := TreeView3.Items.Add(ItemSelectNode, 'Parent');
ParentList := GetParents(HandleArbre);
Node := ParentNode;
try
if ParentList.Count > 0 then
HandleTopParent := THandle(ParentList.Objects[ParentList.Count-1]);
for IndexParent := ParentList.Count-1 downto 0 do
begin
Node := TreeView3.Items.AddChildObject(Node, ParentList.Strings[IndexParent], ParentList.Objects[IndexParent]);
end;
finally
ParentList.Free();
end;
FrereNode := TreeView3.Items.Add(ItemSelectNode, 'Frères');
VoisinNode := TreeView3.Items.Add(FrereNode, 'Voisins');
FreresList := GetFreres(HandleArbre);
FreresList.Sort();
try
for IndexFrere := 0 to FreresList.Count-1 do
begin
if SameParent(HandleTopParent, Integer(FreresList.Objects[IndexFrere])) then
Node := FrereNode
else
Node := VoisinNode;
Node := TreeView3.Items.AddChildObject(Node, FreresList.Strings[IndexFrere], FreresList.Objects[IndexFrere]);
ArbreEnfant(TreeView3.Items, Node, THandle(FreresList.Objects[IndexFrere]));
end;
finally
FreresList.Free();
end;
finally
TreeView3.Items.EndUpdate();
end;
end; |
Partager