== Working with Components and Windows == === Finding a Window Handle === Use function ''FindWindow()'' to get a window handle. If a child window is required, use ''FindWindowEx()''. Example: procedure TfrmMain.btnGetWinInfoClick(Sender: TObject); var i: integer; lWnd: THandle; AppTitle, WndName, ClassName: string; Title: array[0..255] of char; pid: dword; begin // get a top-level form ClassName := 'TForm'; // or TPanel, TButton, etc. lWnd := FindWindow(PAnsiChar(ClassName), nil); if lWnd > 0 then LogWinInfo(lWnd, 'btnGetWinInfoClick() found window'); // get a child window ClassName := 'TForm'; WndName := 'My Window'; lWnd := FindWindowEx(FindWindow('TApplication', nil) {ParentWinHwnd where to start search}, 0 {ChildWinHwnd where to start search}, PAnsiChar(ClassName) {ClassName to search}, PAnsiChar(WndName) {WindowName to search} ); if lWnd > 0 then LogWinInfo(lWnd, 'btnGetWinInfoClick() found window'); // get child windows with the specified class and/or window title GetWindowText(GetHandle('TApplication' {ClassName}, nil {Window Title to search}), Title {Title to retrieve}, 255); end; A routine that provides a handle for a child window or control: function GetHandle(ClassName, WindowName: PAnsiChar): THandle; begin // find specified form Result := FindWindow(ClassName, WindowName); LogWinInfo(Result, 'GetHandle()'); // find child windows and list them (log) EnumChildWindows(Result, @GetMyChildWindow, 0); Result := GetWindow(Result, GW_CHILD); LogWinInfo(Result, 'GetHandle()'); Result := GetWindow(Result, GW_CHILD); LogWinInfo(Result, 'GetHandle()'); Result := GetWindow(Result, GW_HWNDNEXT); LogWinInfo(Result, 'GetHandle()'); end; A sample callback function used by ''EnumWindows()'' or ''EnumChildWindows()'': function GetMyChildWindow(Handle: HWND; LParam: longint): bool; stdcall; begin LogWinInfo(Handle, 'GetMyChildWindow()'); result := True; end; Use ''GetClassName()'' and ''GetWindowText()'' to get more information about a handle: procedure LogWinInfo(WinHandle: THandle; Msg: string); var WindowTitle, ClassName: array [0..255] of char; begin GetClassName(WinHandle, ClassName, 255); GetWindowText(WinHandle, WindowTitle, 255); DebugStr(format('%s: H = [%10.d], Class = [%-20.20s], Window = [%s].', [Msg, WinHandle, ClassName, WindowTitle])); end; === TWinControl.Parent vs TWinControl.ParentWindow === From Delphi User Documentation: (("ParentWindow property (TWinControl)", Delphi Help, Borland)) * ''ParentWindow'' refers to the window handle that underlies the parent control. To designate a non-VCL control as a parent, assign that control’s handle to ''ParentWindow''. This assignment causes the control to be moved into the parent’s screen area. Setting ''ParentWindow'' has no effect if ''Parent'' is not ''nil'' (Delphi) or NULL (C++).

TActiveXControl objects use ''ParentWindow'' to insert a control in an ActiveX container window. ''ParentWindow'' is set automatically when a control is constructed with a call to ''CreateParented()'' (Delphi) or the appropriate overloaded constructor (C++). * Some controls (such as ActiveX controls) are contained in native windows rather than in a parent VCL control. For these controls, the value of ''Parent'' is ''nil'' (Delphi) or NULL (C++) and the ''ParentWindow'' property specifies the window. (("Parent property (TControl)", Delphi Help, Borland)) == Finding a Control/Window from a Handle === Use ''FindControl()'' to get the VCL control given a previously retrieved handle. Example: const MAIN_WND_CLASS = 'TAppBuilder'; procedure TTBCConfig.SetGradient(const aVisible: Boolean); var i: Integer; lWinCtrl: TWinControl; lWnd: Hwnd; lCtrlBar: TControlBar; begin lWnd := FindWindow(MAIN_WND_CLASS, nil); // find the required window lWinCtrl := FindControl(lWnd); // find the control using the given handle // do some work with the control now if lWinCtrl <> nil then begin lCtrlBar := nil; // find the control bar on the app builder form for i := 0 to lWinCtrl.ControlCount - 1 do begin if lWinCtrl.Controls[i] is TControlBar then begin lCtrlBar := TControlBar(lWinCtrl.Controls[i]); break; end; end; end; end;