![]() |
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 |
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] |
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 ;)
|
AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
Hm,
das mit "aus der Schleife nehmen" könnte passen, mal ausprobieren. Danke |
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; |
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 |
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 ;-) |
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. |
AW: Feststellen, ob Prozess (Handle bekannt) noch gestartet ist
GetExitCodeProcess & STILL_ACTIVE
|
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 19:31 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