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.