Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Feststellen, ob Prozess (Handle bekannt) noch gestartet ist (https://www.delphipraxis.net/162267-feststellen-ob-prozess-handle-bekannt-noch-gestartet-ist.html)

hoika 15. Aug 2011 10:44

Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Hallo #,

ich starte auf Button.Klick per ShellExecuteEx einen Prozess (PDF anzeigen).
Während die PDF angezeigt wird, soll der entsprechende Button disabled sein.
Per Timer will ich jetzt testen, ob der gestartete PDF-Reader (z.B. Acrobat) noch läuft.

hProcess bekomme ich ja über ShellExecuteEx raus.

Die Prozessliste und das manuelle Durchsuchen (CreateToolHelp32SnapShot) wollte ich eigentlich nicht benutzen.

Es geht hier nicht um ShellExecuteAndWait !
Die Anwendung soll während der Anzeige der PDF weiter benutzbar sein.

Stehe gerade auf dem Schlauch -> erster Arbeits-Tag nach Urlaub ;)

Danke

DeddyH 15. Aug 2011 10:53

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Wenn Du CreateProcess nimmst, bekommst Du u.A. auch das Thread-Handle (TProcessInformation.hThread). Nun könntest Du doch zyklisch EnumThreadWindows aufrufen und schauen, ob passende Fenster vorhanden sind. Aber es gibt bestimmt auch noch bessere Möglichkeiten.

[edit] Sry, Du brauchst nicht das Handle, sondern die ThreadID, aber die wird auch in TProcessInformation zurückgegeben. [/edit]

Neutral General 15. Aug 2011 10:53

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Sollte doch genauso wie ShellExecuteAndWait funktionieren - nur dass der Kram in der Schleife nicht in einer Schleife ausgeführt wird, sondern in deinem Timer ;)

hoika 15. Aug 2011 11:36

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Hm,

das mit "aus der Schleife nehmen" könnte passen, mal ausprobieren.


Danke

ASM 15. Aug 2011 12:34

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Vielleicht hilft dies hier aus meiner Codesnippet-Sammlung:
Code:
uses PsAPI;

function ProcessExists(const ABaseName: string): Boolean;
// ref: http://delphikingdom.com/asp/answer.asp?IDAnswer=24727
const
  MAX_PID = 1024;
var
  lpidProcess: array[0..MAX_PID - 1] of DWORD;
  cbNeeded: DWORD;
  i: Integer;
  hProcess: THandle;
  lpBaseName: array[0..MAX_PATH] of AnsiChar;
begin
  Result := False;
  if not EnumProcesses(@lpidProcess, MAX_PID, cbNeeded) then Exit;
  for i := 0 to (cbNeeded div SizeOf(DWORD)) do
  begin
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, lpidProcess[i]);
    if hProcess <> 0 then
    try
      if GetModuleBaseName(hProcess, 0, lpBaseName, MAX_PATH) <> 0 then
      begin
        if SameText(lpBaseName, ABaseName) then
        begin
          Result := True;
          Break;
        end;
      end;
    finally
      CloseHandle(hProcess);
    end;
  end;
end;

// Beispiel:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not ProcessExists('Firefox.exe') then doSomething;
end;

hoika 15. Aug 2011 13:05

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Hallo,

ein hilft nicht.
Der Acrobat-Reader könnte ja 1mal schon offen sein.
Ich suche aber genau meinen erzeugten Prozess.


Heiko

Neutral General 15. Aug 2011 13:07

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Hast du meinen Vorschlag denn mal ausprobiert?

Wobei man die Methode von ASM auch ohne Probleme deinen Bedürfnissen anpassen könnte ;-)

ehX 15. Aug 2011 13:19

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Mal eine, vielleicht blöde Idee:

Eine WM_NULL Message via SendMessage() oder SendMessageTimeout() an das bekannte Handle schicken und nachsehen, ob was >=0 zurückkommt.

brechi 15. Aug 2011 14:08

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
GetExitCodeProcess & STILL_ACTIVE

Aphton 15. Aug 2011 16:12

AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
 
Nee..
Verwende ganz sicher ShellExecuteAndWait.
Lagere die Exekution in nen Thread aus und sorge per Synchronize dafür, dass dein Button ordentlich enabled/disabled wird!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz