Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.001 Beiträge
 
Delphi 12 Athens
 
#10

AW: ShellExcecute/FindWindow/MoveWindow

  Alt Heute, 10:08
Hier mal ein Beispiel angelehnt an den ursprünglichen Code:
Delphi-Quellcode:
procedure RunAndWaitShell(const AExecutable, AParameter: string; AShowParameter: Integer; AOnAfterStart: TProc);
var
  ExecInfo: TShellExecuteInfo;
  WaitResult: DWord;
begin
  FillChar(ExecInfo, SizeOf(ExecInfo), 0);

  ExecInfo.cbSize := SizeOf(ExecInfo);
  ExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  ExecInfo.Wnd := Application.Handle;
  ExecInfo.lpVerb := 'open';
  ExecInfo.lpFile := PChar(AExecutable);
  ExecInfo.lpParameters := PChar(AParameter);
  ExecInfo.lpDirectory := nil;
  ExecInfo.nShow := AShowParameter;
  ExecInfo.hInstApp := 0;

  if ShellExecuteEx(@ExecInfo) then
  begin
    WaitResult := WaitForInputIdle(ExecInfo.hProcess, 10000);
    if WaitResult = WAIT_FAILED then
      ShowMessage('WaitForInputIdle ist fehlgeschlagen!');

    if Assigned(AOnAfterStart) then
      AOnAfterStart;

    repeat
      WaitResult := WaitForSingleObject(ExecInfo.hProcess, 500);
      Application.ProcessMessages;
    until WaitResult <> WAIT_TIMEOUT;

    CloseHandle(ExecInfo.hProcess);
  end
  else
    ShowMessage('Prozess konnte nicht gestartet werden!');
end;

// Aufruf:
  RunAndWaitShell('emperormapper.exe', '', SW_SHOW,
    procedure
    var
      WinHandle: THandle;
    begin
      WinHandle := FindWindow(nil, 'EmperorMapper');
      MoveWindow(WinHandle, 600, 600, 400, 400, True);
    end
  );
Zur Erklärung:
Der Prozess wird gestartet. Dann wird gewartet, bis der Prozess alle anstehenden Eingaben abgeschlossen hat und auf Eingaben wartet. Dann wird eine anonyme Methode aufgerufen, in der du deine Aktionen durchführen kannst. Und danach wird gewartet, bis der Prozess beendet ist.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat