No termino de entender con precisión lo que pretendes. ¿Quieres abrir un proceso, esperar a que esté abierto y entonces ponerlo en primer plano y tras esto cerrar la aplicación que lo abrió?
SI es esto lo que pretendes, yo utilizaría un createprocess que esperaría que se abra, localizaría el handle de la ventana del proceso abierto para ponerlo en primer plano y luego me termino tranquilamente.
Para localizar el handle de la ventana no usaría FindWindow, existe una forma mejor. Puesto que conocemos el hProcess del proceso hijo, conocemos su ProcessID. Con esto en la mano, enumeramos las ventanas hasta encontrar una que tenga ese ProcessID y nos quedamos con su Handle para ponerla en primer plano.
Código Delphi
[-]
function GetProcessId(hProcess: THANDLE): DWORD; stdcall; external Kernel32;
........................
implementation
function GetWindowFromPId(PId: DWORD): THandle;
type
TWinParam = record
Handle: THandle;
PId: DWORD;
end;
PWinParam = ^TWinParam;
var
WinParam: TWinParam;
function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall;
var
PId: DWORD;
begin
Result:= true;
PId:= 0;
GetWindowThreadProcessId(Handle, PId);
if PWinParam(lParam).PId = PId then
begin
PWinParam(lParam).Handle:= Handle;
Result:= false;
end;
end;
begin
WinParam.Handle:= 0;
WinParam.PId:= PId;
EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
repeat
Result:= WinParam.Handle;
WinParam.Handle:= Windows.GetParent(Result);
until WinParam.Handle = 0;
end;
function Execute(CommandLine: String): THandle;
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
ZeroMemory(@SI, sizeof(TStartupInfo));
SI.cb:= sizeof(SI);
SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION or STARTF_USESIZE;
SI.wShowWindow:= SW_SHOW;
Result:= 0;
if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
begin
WaitForInputIdle(PI.hProcess, 10000);
Result:= GetWindowFromPId(PI.dwProcessId);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end;
procedure EjecutamosyNosVamos;
var
hWin: HWND;
begin
hWin:= Execute('Notepad.exe');
SetWindowPos(hWin, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
Close; end;
Saludos.