![]() |
Task beenden
Hi!
Ich möchte mit meinem Programm ein anderes Programm beenden. Wie mach ich das? |
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? |
Re: Task beenden
Ich hab dieses mal gesucht und bin auch fündig geworden ;)
Hab diesen Thread gefunden: ![]() 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? |
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; |
Re: Task beenden
Da ist gar nichts angepasst. Allerdings wäre der Wortlaut der Fehlermeldungen hilfreich, um dir zu helfen.
|
Re: Task beenden
Zitat:
|
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. |
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! :) |
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; |
Re: Task beenden
Delphi-Quellcode:
sollte er nicht mit execheck herausfinden ob das programm das übergeben wird gerade läufft?
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; warum öffnet er es bei jedem TimerTick erneut? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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