AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExcecute/FindWindow/MoveWindow

Ein Thema von geldis · begonnen am 8. Jun 2025 · letzter Beitrag vom 9. Jun 2025
Antwort Antwort
geldis

Registriert seit: 19. Jan 2022
48 Beiträge
 
#1

AW: ShellExcecute/FindWindow/MoveWindow

  Alt 9. Jun 2025, 07:40
Moin.

Seien wir ehrlich : Das funktioniert problemlos und ich habe es einigermaßen verstanden.

Die Abteilung ShellExecute und vor allem die diversen Informationen wie
>> FProcessEntry32, Process32First(FSnapshotHandle, FProcessEntry32), FProcessEntry32.szExeFile, WaitForInputIdle ......

und das ganze andere Zeug - das steht jetzt auf der ToDo Liste. Ich muss und möchte das lernen und verstehen.

Bis dahin lasse ich das jetzt so. Falls niemand ensthafte Einwände hat.

Ich danke jedenfalls allen hier Beteiligten für die Unterstützung und vor allem für die Denkanstösse und Hinweise wo man denn überhaupt mal nachschaut.

geldis
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: ShellExcecute/FindWindow/MoveWindow

  Alt 9. Jun 2025, 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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz