![]() |
externes programm schliessen
wie kann ich denn ein anderes programm aus delphı heraus sauber beenden?
Welche funktion brauche ich dazu? Ich wiii den prozess über dıe prozess id suchen und dann beenden. Einfach den task zu kıllen ist nicht sehr gut. İch habe mıtbekommen, dass es mıt WM_CLOSE gehen soll, allerdings hab eich auch nach langer suche bısher nıx gefunden. könnt ıhr mır da bitte weiterhelfen! gruss heriam |
Re: externes programm schliessen
Hi,
Klappt nicht immer da es ggf. noch Nachfragen vom Programm geben kann zB.: "...Die Aktuellen Dateien speichern..." etc. So gehts.:
Delphi-Quellcode:
// Edit: so ists wohl besser.
// (* ungetested *)
procedure SendCloseTo(wndClass, wndName: PChar); var _hWnd: HWND; begin _hWnd := FindWindow(wndClass, wndName); if _hWnd <> 0 then SendMessage(_hWnd, WM_CLOSE, 0, 0); end; // Aufruf: procedure TFormXYZ.ButtonXClick(...); begin // "Notepad" ist der Fensterklassenname des Notepad-Texteditors // Der Fenstertitel heisst zu anfang genauso, kann sich aber nach // dem speichern ändern. Also nicht verwechseln. ;-) SendCloseTo('Notepad', nil); end; |
Re: externes programm schliessen
Zitat:
|
Re: externes programm schliessen
Ist der name notepad ist das der prozessname ohne die endung ".exe" am schluss?
|
Re: externes programm schliessen
Nein, das ist der Klassenname des Fensters.
|
Re: externes programm schliessen
Zitat:
denn ich weiss ja von vornhınweg ja nicht wie die klassennamen der fenster von externen programmen lauten, die ich schliessen möchte. |
Re: externes programm schliessen
Da musst Du dann ein paar Umwege gehen (EnumThreadWindows fällt mir da spontan ein).
|
Re: externes programm schliessen
Zitat:
Zitat:
Auf Prozesse kann man IMHO nicht mit WM_CLOSE beenden. (aber vill. das Fensterhandle finden..?!) |
Re: externes programm schliessen
würde man mit dem fensterhandle dann auch herausbekommen welche weiteren prozess meine anwendung gestartet hat, um dıesen dann gleıch mıtzubeenden?
also so was: anwendung.exe -> startet -> weitere_anwendung.exe -> usw.... edit: also hier haette ich mal was gefunden, ![]() bei manchen prozessen bekomme ich da einfach eine 0 zurück. wenn ich jetzt mal als beispiel gimp portable von portable apps prüfe, dann werden da zweı prozesse gestartet: zum einen dıe "GimpPortable.exe" und die "gimp-2.4.exe". sobald ich dann aber die beıden prozesse abprüfe, bekkomme ıch nur beı der "gimp-2.4.exe" einen handle zurück. beim anderen ist der handle 0. gruss heriam |
Re: externes programm schliessen
jemand ne ıdee?
|
Re: externes programm schliessen
Die Forenregeln sehen vor, erst nach 24 Stunden zu pushen.
Es gibt grundsätzlich zwei Möglichkeiten: Entweder du verwendest die Tool-Help-Api, um durch alle Prozesse zu iterieren und die Eltern-Prozess-ID zu erhalten. Damit kannst du allerdings in bestimmten Fällen nicht alle Prozesse ermitteln: Wenn du nach Kindern von Prozess A suchst, kann es passieren, dass A einen Prozess B gestartet hat, der wiederum C erzeugt hat. Wenn B nun terminiert, kommst du nicht mehr an C heran. Die zweite Möglichkeit verwendet ein Job-Objekt. Du musst Prozess A in den Job stecken (AssignProcessToJobObject). Alle Kindprozesse, die ab diesem Zeitpunkt erzeugt werden, sind ebenfalls im Job. Mit QueryInformationJobObject erhältst du eine Liste aller Prozesse im Job. Auch hier gibt es jedoch Nachteile: Erstens musst du zuerst den Prozess dem Job zuweisen. Zweitens kann ein Prozess nur in einem Job sein; es kann also zu Fehlern kommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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