Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Externes Programm sofort beenden (ein Spiel!) (https://www.delphipraxis.net/12097-externes-programm-sofort-beenden-ein-spiel.html)

Lefko 20. Nov 2003 16:12


Externes Programm sofort beenden (ein Spiel!)
 
Hallo Freunde :hi: ,

ich will ein Spiel gleich wieder schließen, wenn es gestartet wurde. Welchen Befehl sollte ich da am Besten verwenden? also das is sowas wie Gothic oder so ein Grafik-Spiel eben. Hat das auch einfach nur ein Handle?
ich würd da jetzt über findWindowByExename (gibts hier doch irgendwo) und dann SendMessage(...,wm_quit,...) oder so rangehen, right?

Würde mich über ein paar Tipps freuen :)


MfG Lefko.

Thunderchild 20. Nov 2003 16:37

Re: Externes Programm sofort beenden (ein Spiel!)
 
Das soll sich also selbst beenden, ja?
Dann würde ein einfaches Application.terminate reichen.

Lefko 20. Nov 2003 16:42

Re: Externes Programm sofort beenden (ein Spiel!)
 
Zitat:

Zitat von Thunderchild
Das soll sich also selbst beenden, ja?
Dann würde ein einfaches Application.terminate reichen.

Haste den Titel des Threads nich gelesen? ich will ein externes Spiel beenden!

ein timer soll prüfen, ob das spiel (z.b. Gothic oder CS oder so) gestartet wurde und das dann wieder beenden!

MfG Lefko.

Lefko 21. Nov 2003 12:59

Re: Externes Programm sofort beenden (ein Spiel!)
 
Mensch Leude, kann das sein, dass keiner weiss, wie man ein Spiel beenden kann?
Wenigstens Tipps wären was feines! :cry:

Minz 21. Nov 2003 13:12

Re: Externes Programm sofort beenden (ein Spiel!)
 
Schreibst du das Spiel selber oder ist es ein fremdes Programm, das du schließen willst?

CrashMan 21. Nov 2003 13:14

Re: Externes Programm sofort beenden (ein Spiel!)
 
Ich kann dir höchstens ne Routine geben, womit du die laufenden Prozesse siehst und somit siehst, ob das spiel gestartet ist.


Wennman das Spiel nicht starten soll dann schreib doch ein Programm, welches das erste Byte einer Datei in ein X ändert. ... das 1. Byte ist immer ein M (bei *.exe) ... sobald es was anderes ist, tut die nicht mehr.

Soll die wieder tun, machst dus Rückgängig...wenn du willst such ich die Mini-Routine dafür ... ^^

CrashMan

SleepyMaster 21. Nov 2003 13:27

Re: Externes Programm sofort beenden (ein Spiel!)
 
Bidäschön:

Delphi-Quellcode:
var
  run:boolean;
  Speed:integer;
  Programm:string;

procedure SetRun(Value:boolean;Rate:integer;ProgrammName:string);
var
  ThreadHandle: THandle;
  ThreadID: DWORD;

  procedure killProgramm;
  begin
  while Run do
    begin
    sleep(Speed);
    if FindWindow(NIL,PChar(Programm))<>0 then PostMessage(FindWindow(NIL,PChar(Programm)), wm_close, 1, 1);
    end;
  end;

begin
Speed:=Rate;
Programm:=ProgrammName;
if Run=Value then exit;
Run:=Value;
if Value then
  begin
  sleep(1);
  ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@killProgramm),@ProgrammName, 0, ThreadID);
  if ThreadHandle<>0 then CloseHandle(ThreadHandle);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetRun(true,1,'Outlook Express');
end;

Lefko 21. Nov 2003 13:29

Re: Externes Programm sofort beenden (ein Spiel!)
 
Zitat:

Zitat von CrashMan
Ich kann dir höchstens ne Routine geben, womit du die laufenden Prozesse siehst und somit siehst, ob das spiel gestartet ist.


Wennman das Spiel nicht starten soll dann schreib doch ein Programm, welches das erste Byte einer Datei in ein X ändert. ... das 1. Byte ist immer ein M (bei *.exe) ... sobald es was anderes ist, tut die nicht mehr.

Soll die wieder tun, machst dus Rückgängig...wenn du willst such ich die Mini-Routine dafür ... ^^

CrashMan

Wenn das nicht etwas zu brutal ist um das Starten der Datei zu verhindern, würd ich das so machen.
Ist das auch ansonsten ungefährlich, die Exe so zu verändern? Ich weiss auch nicht wie das geht, also könntest du mir die Routine mal posten, bitte. :)


@Minz: Lies doch mal richtig oben; ich hab doch geschrieben, Gothic oder CS oder so. Das sind doch fremde Programme, oder meinste, dass ich die geschrieben hab? ;)


Für weitere Alternativen bin ich offen!

Wenn man sich nämlich das Spiel neu installiert ist die Exe ja wieder funktionsfähig, also muss das was sein, was ENTWEDER immer, wenn die Exe gestartet wird, diese beendet, ODER Jedes Mal, wenn es diese Exe auf dem PC findet, diese verändern.

MfG Lefko.

himitsu 21. Nov 2003 13:32

Re: Externes Programm sofort beenden (ein Spiel!)
 
In der Datei rumschreiben ist schon etwas krass.

Wenn eine Datei nicht gestartet werden soll, hilft es normalerweise schon die zu löschen oder was besser ist, sie zu verschieben oder unzubenennen (z.B. *.exe => *.ex_ oder so)

Es giebt aber auch Programme, die verhindern, das bestimmte Programme gestartet werden und eventuell sogar vorher fragen ob es gestartet werden soll.

Bei mir mach das die FireWall gleich mit - diese Funktion ist bei einigen "Sicherheitsprogrammen" gleich mit drin.

Lefko 21. Nov 2003 13:32

Re: Externes Programm sofort beenden (ein Spiel!)
 
@SleepyMaster: Hm, das werd ich gleich mal ausprobieren! Danke auf jeden Fall mal!
EDIT : Der Text funktioniert überhaupt gar nicht, es passiert nix (wenn ich als 'programm' 'CAPIControl' eingebe z.b., obwohl ein fenster diesen titels offen ist). :(

MfG Lefko.

PS: Hat denn nun so ein Spiel wie Gothic oder CS oder so ein einfaches Handle? das is ja kein normales fenster, also wie soll man da denn FindWindow benutzen? welchen fenster-titel hat denn zum beispiel Counterstrike oder DiabloII?! geht das einfach so?

Minz 21. Nov 2003 13:43

Re: Externes Programm sofort beenden (ein Spiel!)
 
Da steht:

Delphi-Quellcode:
also das is sowas wie Gothic oder so ein Grafik-Spiel eben
Sorry daraus kann ich nicht sicher erkennen, dass das was fremdes ist.

Lefko 21. Nov 2003 14:14

Re: Externes Programm sofort beenden (ein Spiel!)
 
Ja, ich nochmal!

@SleepyMaster: Sorry, der Text funktioniert doch! was soll passieren, wenn man SetRun(false,1,Progname); angibt? da passiert gar nix.

Und noch ne Frage: Ich hab ja den Fensternamen von diesen Spielen nicht! Kann man den irgendwie herausbekommen? (hab was von FindWindowByFileName gelesen irgendwo! geht sowas?)

bin für schnelle tipps sehr dankbar!

MfG Lefko.

SleepyMaster 21. Nov 2003 14:19

Re: Externes Programm sofort beenden (ein Spiel!)
 
Wenn man als Parameter false übergibt, dann kann man das Programm wieder starten, ohne das es sofort wieder beendet wird!

SleepyMaster 21. Nov 2003 14:21

Re: Externes Programm sofort beenden (ein Spiel!)
 
Fenstername steht normalerweiße im Taskmanager!

JUHUU!!! hundertster Beitrag ;)

Lefko 21. Nov 2003 14:31

Re: Externes Programm sofort beenden (ein Spiel!)
 
Zitat:

Zitat von SleepyMaster
Fenstername steht normalerweiße im Taskmanager!

Hm, echt? dann muss man um Diablo II zu beenden einfach SetRun(true,1,'DiabloII');
und für CounterStrike einfach SetRun(true,1,'cstrike'); schreiben?


Zitat:

Wenn man als Parameter false übergibt, dann kann man das Programm wieder starten, ohne das es sofort wieder beendet wird!
Versteh ich nicht, das Programm wird doch nur einmalig beendet? ich konnte Capicontrol sofort wieder starten ohne dass es beendet wurde. das prog is doch dann nicht dauerhaft gesperrt...



Danke, da bin cih schon viel weiter :)

aber zur sicherheit, wie kann ich den fensternamen den erlangen, wenn ich nur den namen der exe-datei hab? der ist doch nicht immer der selbe, ne?

MfG Lefko.

SleepyMaster 21. Nov 2003 14:42

Re: Externes Programm sofort beenden (ein Spiel!)
 
Wenn du das Programm nur einmal beenden (oder halt ins Timer ereigniss setzen willst) willst dann genügt:

Delphi-Quellcode:
if FindWindow(NIL,PChar(Programmname))<>0 then PostMessage(FindWindow(NIL,PChar(Programmname)), wm_close, 1, 1);
Der Rest ist eigendlich nur dafür da anstelle von Timern Threads zu nehmen (z.b.:NonVCL).

Aber das andere ist wesentlich einfacher:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FindWindow(NIL,'DiabloII')<>0 then PostMessage(FindWindow(NIL,'DiabloII'), wm_close, 1, 1);
if FindWindow(NIL,'cstrike')<>0 then PostMessage(FindWindow(NIL,'cstrike'), wm_close, 1, 1);
end;

Nimm also lieber das Zweite hier!

moin339 21. Nov 2003 14:50

Re: Externes Programm sofort beenden (ein Spiel!)
 
Moin!

wenn du verhindern willst das ein spiel erst gestartet wird, kannst du doch einfach einen globalen hook schreiben der das abfängt.
ciao, moin339 :coder:

Lefko 22. Nov 2003 12:17

Re: Externes Programm sofort beenden (ein Spiel!)
 
Zitat:

Zitat von moin339
wenn du verhindern willst das ein spiel erst gestartet wird, kannst du doch einfach einen globalen hook schreiben der das abfängt.

Leider hab ich von Hooks keine Ahnung, weiss nicht im geringsten, wie sowas geht, aber wenn du mir da behilflich sein könntest und das eine Sichere Methode ist, wäre ich dankbar :)

MfG Lefko.

Lefko 24. Nov 2003 16:29

Re: Externes Programm sofort beenden (ein Spiel!)
 
Oke, ich hab das jetz einfach ganz simpel mit

Delphi-Quellcode:
if FindWindow(nil, Programm) <> 0 then PostMessage(..programm.....wm_close...)
gemacht und es klappt wunderbar...

also, allet gelöst, kann dichtgemacht werden :)

MfG Lefko.


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