Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   mehrere Programme gleichzeitig schließen (https://www.delphipraxis.net/39572-mehrere-programme-gleichzeitig-schliessen.html)

michaela 4. Feb 2005 15:59


mehrere Programme gleichzeitig schließen
 
Hallo,

ich möchte 3 Delphiprogramme (arbeiten zusammen) gleichzeitig, z.B. durch Anklicken eines Buttons, schließen. Die zugehörigen Exedateien befinden sich in einem Oberordner in 3 verschiedenen Unterordnern.

Was jemand, wie das geht?

Michaela

malo 4. Feb 2005 16:04

Re: mehrere Programme gleichzeitig schließen
 
Die Exe-Dateien bringen dir gar nichts. Du musst das Handle der Programme herausfinden und dann eine Message ans zu schließende Programm schicken. Such mal im Forum danach ;)

toms 4. Feb 2005 16:21

Re: mehrere Programme gleichzeitig schließen
 
Zitat:

Zitat von malo
Die Exe-Dateien bringen dir gar nichts.

Warum nicht? Er kann doch auch über eien Exe-Namen ein Programm schliessen.

michaela 4. Feb 2005 17:10

Re: mehrere Programme gleichzeitig schließen
 
Ich habe leider noch sehr wenig Erfahrung.

Wie müsste denn so ein Befehl aussehen, mit dem ein anderes Programm geschlossen werden muss? (das zu schließende Programm wird normalerweise nur mit close geschlossen)

Michaela

malo 4. Feb 2005 17:13

Re: mehrere Programme gleichzeitig schließen
 
Zitat:

Zitat von toms
Zitat:

Zitat von malo
Die Exe-Dateien bringen dir gar nichts.

Warum nicht? Er kann doch auch über eien Exe-Namen ein Programm schliessen.

Seit wann? Also soweit ich weiß, braucht man dafür doch "nur" das Handle des zu schließenden Programms :gruebel:

Ob man über den Exe-Namen ans Handle kommt, weiß ich nicht. Aber einen anderen Weg kann ich mir nicht vorstellen ;)

toms 4. Feb 2005 17:20

Re: mehrere Programme gleichzeitig schließen
 
{Für Windows 9x/ME/2000/XP }

Delphi-Quellcode:
uses
  Tlhelp32;

function KillTask(const ExeFileName: TFileName): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('notepad.exe');
end;

Neutral General 4. Feb 2005 17:21

Re: mehrere Programme gleichzeitig schließen
 
Delphi-Quellcode:
var Fenster : Hwnd;
Fenster := FindWindow(nil,'FensterCaption');
SendMessage(Fenster,WM_CLOSE,0,0);
so etwa, nur in deinem Fall für mehrere Fenster

[edit]*hochschau* : ohh.. toms Lösung ist wohl etwas professioneller und du kannst einfach den Exenamen eingeben. :? [/edit]

Remote1 4. Feb 2005 17:28

Re: mehrere Programme gleichzeitig schließen
 
probiers mal damit
dafür suchst du aber auch die handles, halt nur über den exakten fenstertitel
Delphi-Quellcode:
var handle: HWnd;
begin
  handle := FindWindow(NIL,'Form1');//statt Form1 halt deinen fenstertitel
  if handle<>0 then PostMessage(W, wm_close, 1, 1);
end;
oder du machsts über "prozesse auflisten und beenden"
solltest da genug im forum finden (da kann man unter anderem auch dan pfad der exe auslesen den du ja dann mit deinem vergleichen kannst - meiner meinung nach aber viel zu umständlich, einfacher und schneller ist die obere variante)

Sprint 4. Feb 2005 17:42

Re: mehrere Programme gleichzeitig schließen
 
Zitat:

Zitat von toms
TerminateProcess[/delphi]

Man muss ja nicht gleich den Prozess so brutal abschießen. Sinnvoller wäre, wenn man die ProcessId hat, mit EnumWindows & GetWindowThreadProcessId das Fensterhandle zu suchen. Eine SC_CLOSE Nachricht an das Fenster schicken. Gibt IsWindow immer noch True zurück, dann kann man auch eine WM_QUIT Thread Nachricht schicken. Und danach als letzte Option würde ich TerminateProcess nehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 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