AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Anderes Programm beenden

Ein Thema von zeras · begonnen am 21. Mai 2020 · letzter Beitrag vom 21. Mai 2020
Antwort Antwort
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#1

Anderes Programm beenden

  Alt 21. Mai 2020, 12:29
Hallo,

für Testzwecke möchte ich ein externes Programm starten und nach einiger Zeit wieder beenden.
Im Forum habe ich verschiedene Ansätze gefunden. Die einen machen das mit
TerminateProcess , die anderen mit
SendMessage(GetWindowFromID(GetProcessID(programm)), WM_CLOSE, 0, 0); //Programm beenden senden Was ist der Unterschied zwischen den Funktionen? Was sollte man am besten nehmen? Oder gibt es noch weitere Funktionen, die man nehmen kann?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain

Geändert von zeras (21. Mai 2020 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 12:39
TerminateProcess ist ein hartes beenden des anderen Programmes ohne ihm die Möglichkeit zu geben Daten zu sichern.
Ein WM_CLOSE ist der normale Weg (wie auch beim Klick auf das x rechts oben am Fenster der Anwendung.
Windows Vista - Eine neue Erfahrung in Fehlern.

Geändert von TBx (21. Mai 2020 um 13:02 Uhr) Grund: Tipselfehler korrigiert
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#3

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 12:43
Ein WM_CLOSE ist der normale Weg (wie auch beim Klick auf das x rechts oben am Fenster der Anwendung.
Dann werde ich das nehmen. Das scheint mir besser für meinen Test.

Danke.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain

Geändert von TBx (21. Mai 2020 um 13:03 Uhr) Grund: Tipselfehler korrigiert
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
709 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 14:09
Hallo Zeras,
vielleicht hilft Dir dieser Link weiter: https://www.delphi-treff.de/tipps-tr...ndung-beenden/. Die dort beschriebene Methode benutze ich seit vielen Jahren mit gutem Erfolg.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#5

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 14:39
Danke auch für die weiteren Infos.
So wie es scheint, kann ich das Programm beenden.
Mein nächstes Problem ist nun aber, dass das Programm mehrmals gestartet wird und ich die Programme wieder in einer vorgegebenen Reihenfolge beenden muss.
Starten tue ich das so
Delphi-Quellcode:
  ShExecInfoW.Wnd := GetForegroundWindow;
  ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW);
  ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS;
  ShExecInfoW.lpVerb := 'open';
  ShExecInfoW.lpFile := PWideChar(WideString(Filename));
  ShExecInfoW.lpParameters := PWideChar(WideString(Para));
  ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename)));
  ShExecInfoW.nShow := WindowState;
  Result := ShellExecuteExW(@ShExecInfoW);
ShExecInfoW habe ich mir dann gemerkt, weiß aber nicht, wie ich das zum Beenden nutze.
Mit Fenster Handles, Process Handles usw. habe ich bisher noch nichts zu tun gehabt.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#6

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 15:07
Du kannst es mit deinem eigenen Programm gern ausprobieren.

Denn es ist auch im Taskmanager der Unterschiet zwischen den Tabs "Prozesse" und "Details".
In Prozesse wird ein WM_CLOSE ans Hauptfenster WM_QUIT an den Prozess (Hauptthread) gesendet,
während in Details ein TerminateProcess ausgeführt wird.

Und ein Klick auf's [X], bzw. das Schließen im Taskleisten-Button sendet das WM_CLOSE ans dortige Fenster. (in uralten Delphis, bzw. bei Application.MainFormOnTaskbar=False, landet das von der Taskleiste nicht im MainForm.Handle, sondern geht an Application.Handle)



Entweder du merkst dir vom MSDN-Library durchsuchenCreateProcess das ProzessHandle oder die ProzessID
oder via MSDN-Library durchsuchenGetProcessTimes bekommst du die Startzeit.


Wenn deine Variablen compilerabhängige "Strings" sind, warum machst du es dir nicht einfach und nimmst dafür auch die compilerabhängigen Typen und Funktionen?
Delphi-Quellcode:
  // nicht die W/Wide oder A/Ansi, sondern die OHNE
  ...
  ShExecInfo.lpFile := PChar(Filename);
  ShExecInfo.lpParameters := PChar(Para);
  ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename));
  ...
  Result := ShellExecuteEx(@ShExecInfo);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Mai 2020 um 15:16 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#7

AW: Anderes Programm beenden

  Alt 21. Mai 2020, 19:19
Danke himitsu,

ich habe nun statt ShellExecuteEx CreateProcess genutzt und dann die ProzessID gemerkt. Dann kann ich bei Beenden
SendMessage(GetWindowFromID(dwProcessId), WM_CLOSE, 0, 0); nutzen und alles ist OK.
Auch deine Hinweise wegen Ansi und Wide habe ich umgesetzt. Ich hatte ein altes Beispiel genutzt und dort war es noch so beschrieben.

Jetzt muss ich nur noch versuchen, die Fensterpositionen zu merken, damit die beim nächsten Start der Programme wieder an derselben Stelle angezeigt werden.
Aber da werde ich bestimmt hier im Forum noch fündig

Danke nochmals.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:24 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