Mega Code Archive

 
Categories / Delphi / System
 

Show the Windows Heirarchy

Title: Show the Windows Heirarchy Question: There are times when you could do with knowing what different window Handles are for testing messaging apps, etc. Without Loading WinSight (with all it's overheads), or getting WinSpy++, here is a simple digest of Handles, Class Names, and Window Captions. Answer: On a Form, place a TreeView Control, and a Button. Paste in the following 3 procedures/ functions into the implementation Code: //--- function GetWinInfo(h:HWND):string; var tmp:PChar; begin //Get the HWND value in hex and Decimal result:=inttohex(h,8); result:=result+' ('+inttostr(h)+')'; //Get ClassName, and Window Caption //Allow upto 255 Characters GetMem(tmp,255); GetClassName(h,tmp,255); result:=result+': '+tmp; tmp[0]:=#0; GetWindowText(h,tmp,255); result:=result+' - '+tmp; FreeMem(tmp); end; procedure GetChildren(h:HWND;n:TTreeNode;T:TTreeview); var Childhw:HWND; ChildNode:TTreeNode; begin //Get any Children ChildHw:=GetWindow(h,GW_CHILD); while Childhw32 do begin //Add this Handle ChildNode:=T.Items.AddChild(n,GetWinInfo(Childhw)); //Get any Children - Recursive call... GetChildren(Childhw,ChildNode,T); //Get the next window Childhw:=GetWindow(Childhw,GW_HWNDNEXT); end; end; procedure GetWinTree(T:TTreeview); var hw:HWND; node:TTreeNode; begin //Loop through all Top Level Windows hw:=FindWindow(nil,nil); while hw32 do begin //Add this Handle node:=t.items.Add(nil,GetWinInfo(hw)); //Get any Children GetChildren(hw,Node,T); //Get the next window hw:=GetWindow(hw,GW_HWNDNEXT); end; end; //--- Then put something like this on the ButtonClick Event Handler... procedure TForm1.Button1Click(Sender: TObject); begin TreeView1.Items.clear; GetWinTree(TreeView1); end; You will then have a List of All current Window Handles, with all Child Windows listed with then in their correct places. This could be expanded with searching/ grouping of like classes, etc. But I leave that to you, here is a starting place. I have used this at various times to get M$ Class names. For instance, if you are using DAO to automatically configure an Access DB to point it's linked tables at a particular SQL Server, I used this to get the Class name of the SQL Server Login form, so that I could search for it and click the OK button before the user gets to it...