Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozess sanft beenden (https://www.delphipraxis.net/87505-prozess-sanft-beenden.html)

stz 1. Mär 2007 15:55


Prozess sanft beenden
 
Moin moin,
ich möchte mir ein kleines Tool schreiben, dass bestimmte Programme startet und auch wieder beendet. Dazu habe ich CreateProcess und TerminateProcess verwendet. Das funktioniert auch soweit sehr gut, aber ich würde das Programm eigentlich ein wenig liebevoller und sanfter beenden. Dazu bin ich nun auf die Idee gekommen, dass ich an das Hauptfenster der Anwendung eine WM_CLOSE Nachricht senden muss. Nur habe ich ja bloß den Dateinamen, den Thread-Handle und den Prozess-Handle. Wie komme ich den an den Handle des Hauptfensters? Oder gibt es gar eine deutlich bessere Lösung für mein Problem?

Freu mich auf gewohnt gute Vorschläge :wink:

Gruß
Malte

brechi 1. Mär 2007 16:30

Re: Prozess sanft beenden
 
Schau mal da nach EnumThreadWindows

C.Schoch 1. Mär 2007 18:58

Re: Prozess sanft beenden
 
Hi,
Wenn du die Jedis instaliert hast kannst du folgende funktionen aus der Unit JCLSysInfo verwenden: GetPidFromProcessName();
GetMainAppWndFromPid();

stz 2. Mär 2007 15:44

Re: Prozess sanft beenden
 
Moin,
Ich hab jetzt ein wenig mit EnumThreadWindows gespielt und das geht auch manchmal. Problem: Ich weiß halt nicht, welches das Hauptfenster ist, wenn zu dem Thread mehr als ein Fenster gehören. Ich werde also diese Idee mal weiter verfolgen:
Zitat:

Zitat von C.Schoch
Wenn du die Jedis instaliert hast kannst du folgende funktionen aus der Unit JCLSysInfo verwenden: GetPidFromProcessName();
GetMainAppWndFromPid();

Die PrcessID hab ich ja eh schon aus den ProcessInformation von CreateProcess.
besten Dank für die Anregungen! :dp:

Gruß
Malte

phreax 2. Mär 2007 16:25

Re: Prozess sanft beenden
 
Zitat:

Zitat von C.Schoch
GetMainAppWndFromPid();[/b]

Na dann kannst du doch sofort mit dem was C.Schoch schon geschrieben hat das handle auslesen :P

denn GetMainAppWndFromPid(); macht imho genau das ;)


mfg phreax

stz 2. Mär 2007 21:50

Re: Prozess sanft beenden
 
Zitat:

Zitat von phreax
Na dann kannst du doch sofort mit dem was C.Schoch schon geschrieben hat das handle auslesen :P

Das habe ich ja versucht, mit diesem Satz auszudrücken:
Zitat:

Zitat von stz
Die PrcessID hab ich ja eh schon aus den ProcessInformation von CreateProcess.

:)
Aber auch bei GetMainAppWndFromPid(); gibt es ein Problem: Es gibt Anwendungen, die scheinbar gar kein Hauptfenster haben, sondern nur in der TNA rumlungern. Dem komme ich jetzt bei, indem ich mit EnumThreadWindows alle Fenster durchgehe und an jedes WM_CLOSE sende. Darauf reagieren jetzt fast alle meine Kandidaten. Nur einer weigert sich auch da standhaft...

Was macht Windows denn eigentlich, wenn ich den Computer runterfahre? Da klappt das doch auch irgendwie sinnvoll.

Gruß
Malte

DGL-luke 2. Mär 2007 22:34

Re: Prozess sanft beenden
 
Tja, Linux macht das so:

Zitat:

sending processes the TERM signal
sending processes the KILL signal
....................
"tilt" ;-)
Window machts ähnlich. Schonmal gesehen, wie ein "Anwendung XYZ konnte nicht beendet werden - Abbrechen/Abschießen" Fenster beim Herunterfahren gekommen ist?

stz 3. Mär 2007 10:57

Re: Prozess sanft beenden
 
Zitat:

Zitat von DGL-luke
Window machts ähnlich. Schonmal gesehen, wie ein "Anwendung XYZ konnte nicht beendet werden - Abbrechen/Abschießen" Fenster beim Herunterfahren gekommen ist?

genau das meine ich. Kann ich sowas nicht auch an einen bestimmten Prozess senden? Genau diesen Mechanismus muss ich doch auch auslösen können, der erst versucht das Programm nett und freundlich zu beenden und danach den Prozess abschießt, wenn er immer noch da ist.

Gruß
Malte

bitsetter 3. Mär 2007 11:23

Re: Prozess sanft beenden
 
Hallo,

beim herunterfahren sendet Windows die Nachrichten WM_QueryEndSession und dann WM_EndSession.
Auf das Beenden von Windows reagieren

stz 3. Mär 2007 11:47

Re: Prozess sanft beenden
 
Zitat:

Zitat von bitsetter
beim herunterfahren sendet Windows die Nachrichten WM_QueryEndSession und dann WM_EndSession.
Auf das Beenden von Windows reagieren

Moin bitsetter,
scheinbar kann man diese Nachricht aber nicht an ein bestimmtes Fenster senden. Das hat herzlich wenig Effekt. :gruebel:
Delphi-Quellcode:
SendMessage(AHandle, WM_ENDSESSION, Integer(True), 0);
//oder
SendMessage(AHandle, WM_QUERYENDSESSION, 0, 0);
Gruß
Malte


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Seite 1 von 2  1 2      

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