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 );