AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Task beenden

Ein Thema von N30N · begonnen am 14. Sep 2007 · letzter Beitrag vom 31. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
N30N

Registriert seit: 7. Aug 2007
78 Beiträge
 
#1

Task beenden

  Alt 14. Sep 2007, 08:59
Hi!

Ich möchte mit meinem Programm ein anderes Programm beenden. Wie mach ich das?
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: Task beenden

  Alt 14. Sep 2007, 09:03
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?
  Mit Zitat antworten Zitat
N30N

Registriert seit: 7. Aug 2007
78 Beiträge
 
#3

Re: Task beenden

  Alt 14. Sep 2007, 09:09
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?
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#4

Re: Task beenden

  Alt 14. Sep 2007, 09:16
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Task beenden

  Alt 14. Sep 2007, 09:17
Da ist gar nichts angepasst. Allerdings wäre der Wortlaut der Fehlermeldungen hilfreich, um dir zu helfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
N30N

Registriert seit: 7. Aug 2007
78 Beiträge
 
#6

Re: Task beenden

  Alt 14. Sep 2007, 09:30
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.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#7

Re: Task beenden

  Alt 14. Sep 2007, 09:34
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.
  Mit Zitat antworten Zitat
N30N

Registriert seit: 7. Aug 2007
78 Beiträge
 
#8

Re: Task beenden

  Alt 14. Sep 2007, 09:49
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!
  Mit Zitat antworten Zitat
taktaky
(Gast)

n/a Beiträge
 
#9

Re: Task beenden

  Alt 19. Sep 2007, 18:07
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;
  Mit Zitat antworten Zitat
Benutzerbild von Blackstar
Blackstar

Registriert seit: 7. Mär 2007
10 Beiträge
 
#10

Re: Task beenden

  Alt 30. Jan 2008, 17:55
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:33 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