A most bemutatásra kerülő cikkben arra láthatunk példát, miként tudjuk lekérdezni a számítógépünkön éppen futó alkalmazások ablakleíróit (handle-jeit), illetve az azokhoz tartozó gyermekobjektumok neveit. Megtudhatjuk az egyes leírók hexadecimális értékét, azt, hogy mely osztály tagjai, illetve az ablak fejlécének feliratát.
Külön eljárást készítünk a szülő illetve a gyermekobjektumok lekérdezésére. Az alábbi függvényben a szülőablakok paramétereit kérdezzük le. Bemeneti értékként egy HWND típusú ablakleírót vár, melyet a későbbiekben bemutatásra kerülő GetWinTree függvény ad át számára.
function GetWinInfo(h:HWND):string;
var tmp:PChar;
begin
A h paraméterben kapott értéket hexadecimális valamint decimális értékké alakítjuk.
result:=inttohex(h,8);
result:=result+' ('+inttostr(h)+')';
A GetMem függvény segítségével lefoglalunk 255 karakter tárolására elegendő memóriaterületet az adatok számára.
A GetClassName függvény a h paraméter által visszaadott ablak leíróját eltárolja az átmeneti memóriaterületen.
GetClassName(h,tmp,255);
result:=result+': '+tmp;
tmp[0]:=#0;
A GetWindowText segítségével az ablak Caption részét kapjuk meg.
GetWindowText(h,tmp,255);
A függvény visszatérési értéke a kapott értékek egymáshoz fűzött sorozata.
result:=result+' - '+tmp;
Végül felszabadítjuk a lefoglalt memóriaterületet.
A gyermekobjektumok lekérdezése a következő eljárással történik.
procedure GetChildren(h:HWND;n:TTreeNode;T:TTreeview);
var Childhw:HWND;
ChildNode:TTreeNode;
begin
A bemeneti értékként kapott ablakleíró segítségével a GetWindow függvény meghatározza az adott ablak gyermekobjektumait., majd átadja azokat a TreeView megfelelő albejegyzéseinek.
ChildHw:=GetWindow(h,GW_CHILD);
while Childhw>32 do
begin
ChildNode:=T.Items.AddChild(n,GetWinInfo(Childhw));
Mivel a gyermekobjektumok további objektumokat tartalmazhatnak, újra meghívjuk ezt a függvényt.
GetChildren(Childhw,ChildNode,T);
A GetWindow függvény GW_HWNDNEXT paraméterével a következő gyermekobjektum leírójára állunk, és újra elvégezzük a vizsgálatot.
Childhw:=GetWindow(Childhw,GW_HWNDNEXT);
end;
end;
A fenti két függvény meghívása a GetWinTree függvénnyel történik, melyben lekérdezzük az éppen aktuális összes folyamat ablakleíróját.
procedure GetWinTree(T:TTreeview);
var hw:HWND;
node:TTreeNode;
begin
A FindWindow segítségével megkeressük az összes ablakot, majd azok handle-jét átadjuk a hw ablakleíró paraméternek.
Az ablakokat sorban egyenként megvizsgáljuk.
Először meghívjuk a GetWinInfo függvényt, mely visszaadja a szülőablakok paramétereit.
node:=t.items.Add(nil,GetWinInfo(hw));
Ezután a GetChildren segítségével kinyerjük az összes gyermekobjektumot is.
Végül a következő ablakra lépünk, s kezdjük elölről a vizsgálatot.
hw:=GetWindow(hw,GW_HWNDNEXT);
end;
end;
Ennek a függvénynek a meghívását egy gomb OnClick eseményéhez kötöttük.
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.clear;
GetWinTree(TreeView1);
end;