Ver Mensaje Individual
  #2  
Antiguo 06-01-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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 [-]

// Importamos GetProcessId si nuestro delphi no la tiene

function GetProcessId(hProcess: THANDLE): DWORD; stdcall;  external  Kernel32;



........................


implementation


//------------------------------------------------------------------------------
// Enumeramos las ventanas para encontrar la que tenga el PId buscado.
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;

//------------------------------------------------------------------------------
// Creamos un proceso.
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;

// Creamos un proceso, localizamos la ventana y la ponemos en primer plano
// Luego nos cerramos.
procedure EjecutamosyNosVamos;
var
  hWin: HWND;
begin
  hWin:= Execute('Notepad.exe');
  SetWindowPos(hWin, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
  Close;  //Nos vamos
end;




Saludos.
Responder Con Cita