Delphi - Az aktuális ablakleírók és azok gyermekobjektumainak lekérdezése

forráskód letöltése
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.
  GetMem(tmp,255);
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.
  FreeMem(tmp);
end;
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.
  hw:=FindWindow(nil,nil);
Az ablakokat sorban egyenként megvizsgáljuk.
  while hw>32 do
    begin
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.
      GetChildren(hw,Node,T);
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;