Ecco i 2 metodi interessati:

codice:
implementation

uses
   Messages,
   Classes,
   Windows,
   SysUtils,
   Generics.Collections;;

var
   piUnitPID                        :  DWORD;
   piUnitMainWindowHandle           :  HWND;
   psUnitWindowClassName            :  string;

function EnumWindowsProc( liHWND: HWND; liParam: integer ): boolean; stdcall;
var
   liPID                            :  DWORD;
   lacBuffer                        :  array[0..MAX_PATH] of Char;
begin
   Result                           := true;
   try
      Windows.GetWindowThreadProcessId( liHWND, &liPID );
      if( liPID = piUnitPID ) then
      begin
         Windows.GetClassName( liHWND, @lacBuffer, MAX_PATH );
         if ( SameText( UpperCase( string(lacBuffer) ), UpperCase( psUnitWindowClassName ) ) ) then
         begin
            piUnitMainWindowHandle  := liHWND;
            Result                  := false;
         end;
      end;
   except
   end;
end;

constructor TMyProcess.Create( const lsProcessPath: string; const lsProcessParams: string; const lsWindowClassName: string; loParentHandle: HWND );
var
   loStartupInfo                    :  TStartupInfo;
   loPocessInfo                     :  TProcessInformation;
begin
   try
      FillChar( loStartupInfo, SizeOf( loStartupInfo ), #0 );
      FillChar( loPocessInfo, SizeOf( loPocessInfo ), #0 );
      psWindowClassName             := lsWindowClassName;
      with loStartupInfo do
      begin
         cb                         := SizeOf( TStartupInfo );
         dwFlags                    := STARTF_FORCEONFEEDBACK + STARTF_FORCEOFFFEEDBACK;
         wShowWindow                := SW_HIDE;
      end;
      if( CreateProcess( nil,
                         PChar( lsProcessPath + lsProcessParams + ' '),
                         nil,
                         nil,
                         false,
                         CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                         nil,
                         nil,
                         loStartupInfo,
                         loPocessInfo ) ) then
      begin
         WaitForInputIdle( loPocessInfo.hProcess, 10000 );
         try
            piPID                   := loPocessInfo.dwProcessId;
            piUnitPID               := piPID;
            psUnitWindowClassName   := psWindowClassName;
            EnumWindows( @EnumWindowsProc , 0 );
            SetParent( piUnitMainWindowHandle, loParentHandle );
         except
         end;
      end;
      CloseHandle( loPocessInfo.hProcess );
      CloseHandle( loPocessInfo.hThread );
   except
   end;
end;
Così invece è come io creo il mio oggetto:

codice:
loProcess      := TMyProcess.Create( 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe', '', 'MozillaWindowClass', Self.Panel1.Handle );