Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Task beenden (https://www.delphipraxis.net/99572-task-beenden.html)

N30N 14. Sep 2007 07:59


Task beenden
 
Hi!

Ich möchte mit meinem Programm ein anderes Programm beenden. Wie mach ich das?

s-off 14. Sep 2007 08:03

Re: Task beenden
 
Hey,

ich habe Dich schon in Deinem letzten Beitrag gebeten, die Suchfunktion dieses Forums zu nutzen. Warum tust Du es nicht einfach?
Und antworte jetzt bitte nicht mit etwas derart 'Hab ich doch, aber nichts gefunden'...

Wenn Du schon für die Recherche keine Geduld hast - wie soll es dann erst bei der Realisierung werden?

N30N 14. Sep 2007 08:09

Re: Task beenden
 
Ich hab dieses mal gesucht und bin auch fündig geworden ;)

Hab diesen Thread gefunden: Thread


Jedoch komme ich damit nicht zurecht.

Sein Code war:

Delphi-Quellcode:
function KillProcess(const ExeName: String): Boolean;
var
  Prozess       : TProcessEntry32;
  h             : THandle;

begin
  Result := False;
  Prozess.dwSize := SizeOf(Prozess);
  h := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
   If Process32First(h, Prozess) then
    Repeat
     If AnsiLowerCase(Prozess.szExeFile) = AnsiLowerCase(ExeName) then Result := TerminateProcess(OpenProcess(Process_Terminate, False, Prozess.th32ProcessID), 0);
    Until (Not Process32Next(h, Prozess)) or Result;
  finally
   CloseHandle(h);
  end;
end;

Jedoch erzeugt dieser bei mir nen Haufen Fehlermeldungen, wahrschienlich ist er an sein eigenes Programm angepasst. Functions setze ich doch unter die implemantation richtig?

s-off 14. Sep 2007 08:16

Re: Task beenden
 
Dann hättest Du weiterlesen sollen.

Dann hättest Du irgendwann gesehen, dass die Funktion sowieso nicht das Gelbe vom Ei ist. Alternativ wird auf WM_CLOSE verwiesen.

Und das geht beispielsweise so (wenn man Notepad beenden möchte):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Handle: HWND;
begin
   Handle := FindWindow('Notepad', nil);
   if Handle <> 0 then
      SendMessage(Handle, WM_CLOSE, 0, 0);
end;

Luckie 14. Sep 2007 08:17

Re: Task beenden
 
Da ist gar nichts angepasst. Allerdings wäre der Wortlaut der Fehlermeldungen hilfreich, um dir zu helfen.

N30N 14. Sep 2007 08:30

Re: Task beenden
 
Zitat:

Zitat von s-off
Dann hättest Du weiterlesen sollen.

Dann hättest Du irgendwann gesehen, dass die Funktion sowieso nicht das Gelbe vom Ei ist. Alternativ wird auf WM_CLOSE verwiesen.

Und das geht beispielsweise so (wenn man Notepad beenden möchte):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Handle: HWND;
begin
   Handle := FindWindow('Notepad', nil);
   if Handle <> 0 then
      SendMessage(Handle, WM_CLOSE, 0, 0);
end;

Also ich will den Media Player Classic beenden. Muss ich dann anstatt "Notepad" den "Media Player Classic" eintragen, oder "mplayerc"? mplayerc.exe ist die zugehörige Datei.

s-off 14. Sep 2007 08:34

Re: Task beenden
 
So ungefähr schon, ja.

Allerdings trägst Du in die FindWindow-Funktion nicht den Namen der Exe ein, sondern den Klassennamen (1. Parameter) und optional den Fenstertitel (2. Parameter).
Die Klasse kannst Du z.B. mit Tools wie WinSpy ermitteln.

N30N 14. Sep 2007 08:49

Re: Task beenden
 
Okay,

Mit Winspy++ habe ich nun folgende Werte:

General -> Handle -> 000606A0
Class -> Afx:00400000:b:0001002D:00000006:00000000 (Unicode)

etc etc



Also muss ich den Wert von "Class" bei Findwindow eintragen und dann funktioniert es? (Afx:00400000:b:0001002D:00000006:00000000) Mit oder ohne Afx?

Das Programm soll auf jedem Rechner laufen, an der Klasse verändert sich doch nix oder?


// Also ich ahbe es mal mit Media Player Classic, sowie mit Afx:00400000:b:0001002D:00000006:00000000 und 00400000:b:0001002D:00000006:00000000 ausprobiert in einem neuen Programm (nur Button und der Code), trotzdem wird der Media Player Classic nicht geschlossen. Woran liegts?

// NOchmal Edit: Also das Notepad kann ich beenden...


//Edit: Juhuu, habs raus! Ich hatte die Zielscheibe auf das Videofesnter, nciht auf den kompletten Player gerichtet. Jetzt gehts! :)

taktaky 19. Sep 2007 17:07

Re: Task beenden
 
Du brauchst nur den Titel von der Anwendung in Button1 Code einzugeben
Delphi-Quellcode:
procedure KillProgram(ClassName: PChar; Titre: String);
const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
Appli : HWND;
begin
Appli := FindWindow(PChar(ClassName), PChar(Titre));
GetWindowThreadProcessID(Appli, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//KillProgram(nil,Edit1.text); du Kannst auch Edit.Text erstellen und drin den Titel eingeben
KillProgram(nil,'Anwendung-Titel'); // hier muss man den Titel von der Anwendung eingeben
end;

Blackstar 30. Jan 2008 16:55

Re: Task beenden
 
Delphi-Quellcode:
function TForm1.Execheck(exename:string): boolean;
var
   Handle: HWND;
begin
   Handle := FindWindow('exename', nil);
   if Handle = 0 then execheck:=false else execheck:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

if ExeCheck('world.exe')=false then MyShellExecute('world.exe');

if ExeCheck('realmserver.exe')=false then MyShellExecute('realmserver.exe') ;

if ExeCheck('loginserver.exe')=false then MyShellExecute('logonserver.exe');

end;
sollte er nicht mit execheck herausfinden ob das programm das übergeben wird gerade läufft?
warum öffnet er es bei jedem TimerTick erneut?


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

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