![]() |
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? |
Re: Task beenden
Zitat:
den Exe-Namen. Zudem übergibst du der Funktion FindWindow den String 'ExeName' und nicht den Parameter ExeName. PS: Die Funktion ExeCheck lässt sich einfacher schreiben:
Delphi-Quellcode:
function TForm1.Execheck(exename:string): boolean;
var Handle: HWND; begin Handle := FindWindow(exename, nil); Result := Handle <> 0; end; |
Re: Task beenden
edit: funzt immernoch nicht so ganz, siehe unten
da der titel des fensters aus Dateipfad und .Exe name bestand hab ich so gelöst fals es jemanden interessiert hier ist der code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin path:=ExtractFilePath(ParamStr(0)); end; function TForm1.Execheck(exename:string): boolean; var Handle: HWND; begin Handle := FindWindow('exename', nil); Result := Handle <> 0; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if world=true then begin if ExeCheck(path+'world.exe')=false then MyShellExecute('world.exe'); end; if realm=true then begin if ExeCheck(path+'realmserver.exe')=false then MyShellExecute('realmserver.exe') ; end; if login=true then begin if ExeCheck(path+'loginserver.exe')=false then MyShellExecute('logonserver.exe'); end; end; |
Re: Task beenden
Das würde ich ein wenig anders schreiben:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin if world and not ExeCheck(path+'world.exe') then MyShellExecute('world.exe'); if realm and not ExeCheck(path+'realmserver.exe') then MyShellExecute('realmserver.exe') ; if login and not ExeCheck(path+'loginserver.exe') then MyShellExecute('logonserver.exe'); end; |
Re: Task beenden
hmm scheint doch nicht so ganz zu funktionieren wie ich mir das vorstelle
er öffnets immernoch bei jedem timertick liegts vielleicht immernoch an dem falschen fenster titel? beispiel: Die Datei hat im Fenster stehen: C:\file.exe dann ist doch dies richtig?
Delphi-Quellcode:
Handle := FindWindow('C:\file.exe', nil);
|
Re: Task beenden
Wenn Du nach dem Fenstertitel gehst, dann andersrum:
Delphi-Quellcode:
Handle := FindWindow(nil, 'C:\file.exe');
|
Re: Task beenden
geht komischerweise auch nicht....
Delphi-Quellcode:
function TForm1.Execheck(exename:string): boolean;
var Handle: HWND; begin Handle := FindWindow(nil,'exename'); Result := (Handle <> 0); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if world and not ExeCheck(path+'ascent-world.exe') then MyShellExecute('ascent-world.exe'); if realm and not ExeCheck(path+'ascent-realmserver.exe') then MyShellExecute('ascent-realmserver.exe') ; if login and not ExeCheck(path+'ascent-logonserver.exe') then MyShellExecute('ascent-logonserver.exe'); end; |
Re: Task beenden
Dann würde ich erstmal testen, ob ExeCheck so, wie Du es aufrufst, funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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