Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tasten senden problem (https://www.delphipraxis.net/48257-tasten-senden-problem.html)

Assun 22. Jun 2005 22:26


Tasten senden problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi !

was bitte ist denn an diesem code falsch ?
Delphi-Quellcode:
procedure Cheat(myString : String);
var
  c : Cardinal;
  i : integer;
  s : String;
begin
  c:=FindWindow(nil,'GTA: San Andreas'); //Get WindowHandle
  if c=0 then
  begin
    MessageDlg('Sie müssen das Spiel zuerst starten !',mtwarning,[mbOK],0);
    Exit;
  end;
for i := 1 to Length(mystring) do
SendMessage(c, WM_CHAR, Ord(mystring[i]), 0); //send Keys
CloseHandle(c);
end;

procedure TForm1.WMHotKey(var msg: TMessage);
begin
if (msg.WParam = 1) then Cheat('LXGIWYL');      // you can choose any number ( up to 4000 )

end;
er bringt mir immer ne exception (die is nie zu sehen) also der debugger mein ich.

und bewirken tuts gar nix :P

Findet ihr da nen fehler ?

Gruß Assun

edit // geemacht. nu bringt er mir Externe Exception XXXX (nen paar zahlen)

edit // Wieder geändert. es folgt die gleiche exception :-(

kennts sich damit jemand aus?

Edit :// habe diesen wahnsinnscode gefunden : http://www.swissdelphicenter.ch/de/showcode.php?id=220

ich habe es aber auch schonmal mit nur 4 Zeilen geschafft. Ich weiss nur nicht mehr wie :wall:

// Code wieder geändert und wieder ne wunderschöne exception (anhang) :-(

malo 22. Jun 2005 22:31

Re: Tasten senden problem
 
Verschieb mal die Compiler-Direktive in deinem Code. Die muss bestimmt an den Anfang des Implemantation-Abschnittes, nciht in die Mitte :roll:

//edit: Welcher Fehler soll denn dort vorkommen? Bitte einmal eine GENAUE FEHLERBESCHREIBUNG machen.

muRR 22. Jun 2005 22:33

Re: Tasten senden problem
 
Der Fehler liegt wohl hier:
Zitat:

for i := 1 to Length(s) do
Die Variable s hat keinen Wert. Ich denke mal, du willst myString durchlaufen?

Assun 23. Jun 2005 08:08

Re: Tasten senden problem
 
ich habe den code nochmal verändert, aber ich erhalte immer noch die gleiche Exception.

Kann mir da mal jemand helfen ?

THX

PierreB 23. Jun 2005 10:07

Re: Tasten senden problem
 
Hallo Assun,

ich weiß das gehört jetzt nicht gut zum Thema, aber trotzdem:
Delphi-Quellcode:
if (msg.WParam = 1) then Cheat('LXGIWYL');
Wie mir scheint, versuchst du einen Trainer für San Andreas zu schreiben. Nur leider sendest du direkt den Cheat (Zeichenkette) an das Spiel. Seit Vice City gibt es aber eine Funktion, die das Cheaten zählt. Und wenn man cheatet, kann man keine 100% mehr erreichen. Wenn man es so macht wie du, steht dann in der Statistik das man gecheatet hat. Bei "richtigen" Spieletrainer greift man direkt auf die Speicheradressen zu und kann somit das Spiel beeinflussen, ohne das das Spiel das merkt. Solltest du Trainer schreiben wollen, empfehle ich dir das Trainer Maker Kit 1.5 (Googlesuche).

alcaeus 23. Jun 2005 10:10

Re: Tasten senden problem
 
Hallo Assun,

Zitat:

Zitat von Assun
ich habe den code nochmal verändert, aber ich erhalte immer noch die gleiche Exception.

koenntest du bitte mal sagen wo genau die Exception auftritt? Eine der Zeilen muss die Exception ja ausloesen.

Eventuell solltest du mal
Delphi-Quellcode:
SendMessage(c, WM_CHAR, Ord(mystring[i]), 0); //send Keys
anstatt
Delphi-Quellcode:
SendMessage(c, WM_CHAR, Word(mystring[i]), 0); //send Keys
verwenden, vielleicht hilft das ja.

Greetz
alcaeus

Assun 23. Jun 2005 10:10

Re: Tasten senden problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
das ist mir auch schon aufgefallen. ich habe ja auch schon so memoryhack trainer für NFSU II geschrieben.

Doch warum alles mühsam suchen (Speicheradressen), wenn ich doch einfach cheats eingeben lasse ? :mrgreen:

aber ich werde es wenn ich mal endlich das mit sendkey kapiert hab eh alles eingeben lassen und dann einfach mit nur einem einzigen memoryhack die Zahl wie oft gecheatet wurde einfrieren lassen ^^

Edit // hab den code wieder so verändert wie Alcaeus es mir geraten hat.

wieder ne exception :wall:

Edit :// falls man es auf dem screenie net erkennen sollte : er hat nen probmel in der Linie wo ich versuch die tasten zu senden

PierreB 23. Jun 2005 10:17

Re: Tasten senden problem
 
Zitat:

Zitat von Assun
das ist mir auch schon aufgefallen. ich habe ja auch schon so memoryhack trainer für NFSU II geschrieben.

Doch warum alles mühsam suchen (Speicheradressen), wenn ich doch einfach cheats eingeben lasse ? :mrgreen:

aber ich werde es wenn ich mal endlich das mit sendkey kapiert hab eh alles eingeben lassen und dann einfach mit nur einem einzigen memoryhack die Zahl wie oft gecheatet wurde einfrieren lassen ^^

Dann verstehe ich den Sinn dieses Trainers nicht. Dann kann ich auch einfach die Cheats selber eintippen und brauch kein extra Programm dazu. Ich glaube nicht das du es schaffst du Zählung der Cheats "einfrieren" zu lassen, selbst wenn als Wert in der Statistik 0 steht weiß das Spiel das gecheatet wurde und man wird nie 100% Spielfortschritt erreichen können.

Außerdem ist San Andreas das beste Spiel des Jahres 2005, und das sollte man ohne Cheats genießen... ;)

Assun 23. Jun 2005 14:34

Re: Tasten senden problem
 
naja aber ich mach das ja auch net um des cheatens willen sondern um des Lernens willen ;-)

weiss keiner eine Antwort?

alcaeus 23. Jun 2005 14:36

Re: Tasten senden problem
 
Zitat:

Zitat von Assun
weiss keiner eine Antwort?

*hust* Wie bitte? Find doch mal raus wo die Exception auftritt und sag uns das. Mir ist nicht nach Ratespielen, und ich denke den andern gehts genauso :roll:
Hast du schon mal versucht, mit dem Code einen String an ein anderes Fenster zu schicken? Funktioniert das?

Greetz
alcaeus

Assun 23. Jun 2005 14:37

Re: Tasten senden problem
 
ich hab doch weiter oben nen screenshot mit der exception angehängt.

alzaimar 23. Jun 2005 18:55

Re: Tasten senden problem
 
super, da steht, das dein Programm ne Macke hat. Und? WO?
In welcher Zeile?
Bei welchem Statement?

:spin: Los! Verrate es uns! Sofort! :roteyes:

Assun 23. Jun 2005 19:25

Re: Tasten senden problem
 
hab euch doch nen Bild mit dem error + Zeile im Anhang !!

Assun 24. Jun 2005 08:39

Re: Tasten senden problem
 
Da einige den Screenshot zu übersehen scheinen schreib ich es euch nochmals auf:

Zitat:

Im Projekt Projekt1.exe ist eine Exception der Klasse EExternal Exception mit der Meldung 'Externe Exception C0000008' aufgetreten.
und die Zeile in der ich SendKey anwende, also in der ich schluss endlich Keys sende is markiert.

ich brauch eure hilfe wirklich ;-)

turboPASCAL 24. Jun 2005 09:13

Re: Tasten senden problem
 
:gruebel:
Delphi-Quellcode:
FindWindow(nil,'GTA: San Andreas');
Muss das nicht so heissen ?
Delphi-Quellcode:
FindWindow('GTA: San Andreas', nil);

alzaimar 24. Jun 2005 09:15

Re: Tasten senden problem
 
Ich habe einen schwarzen Block genau da, wo die Zeilen sind...
Versuche es mit Fehlereingrenzung:
1. Schicke die Zeichen an ein anderes Programm, z.B. ein eigenes (1x Form, 1xEditfeld, fokusiert)
2. Schicke nur ein Zeichen.
3. Stimmt das Handle?
...
Danach sehen wir weiter.

@turboPascal: Du scheinst (3) schon beantwortet zu haben :zwinker:

Assun 24. Jun 2005 09:28

Re: Tasten senden problem
 
so. habe meinen Code mal etwas umgeschrieben.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hOE: hWnd;
  s : string;
  i : integer;
begin
   hOE:=FindWindow(nil,'Unbenannt - Editor');//Finde das Fenster mit Notepad
   if hOE = 0 then ShowMessage('Nix gefunden');
   s := 'test';
   for i := 1 to Length(s) do
SendMessage(hOE, WM_CHAR, Word(s[i]), 0); //send Keys
end;
keine Fehler, keine abgesstürtzen progs mehr. aber funtkionieren tuts au net :-(

turboPASCAL 24. Jun 2005 10:47

Re: Tasten senden problem
 
Ein Beispiel um Text ins Notepat einzufügen über SendMessage, FindWindow, FindWindowEx

Delphi-Quellcode:
procedure TForm1.ButtonXClick...
const
  mystring: string =
    'DerSuperduperBlaBlaTextStringdenmaneinfuegenwill oder so :-)';
var
  wh: HWND;
  i: Integer;
begin
  wh := FindWindow('Notepad', nil); //Notepad window finden
  if wh <> 0 then
  begin
    wh := FindWindowEx(wh, 0, 'Edit', nil); // das edit feld im Notepad
    for i := 1 to length(mystring) do
    begin
      // Word() oder Ord() - Hauptsache aus z.B. 'A' wird 65 :-)
      SendMessage(wh, WM_CHAR, Word(mystring[i]), 0);
    end;
  end else
    ShowMessage('Sorry, Window not found, start the Notepad pleace ?');
end;
also sollte es auch so eine Reihe von Chars an dein Prg. senden
(wenn das Windowhandle bzw. Fenster/Programmname stimmt):

Delphi-Quellcode:
procedure ...
const
  mystring: string = 'DerSuperduperBlaBlaCheat';
var
  wh: HWND;
  i: Integer;
begin
  wh := FindWindow('GTA: ...', nil); // Window finden
  Windows.SetFocus(wh); // Focus auf das empfangende Prg. damit es auch Keys verarbeitet ?
  if wh <> 0 then
  begin
    for i := 1 to length(mystring) do
    begin
      // Word() oder Ord() - Hauptsache aus z.B. 'A' wird 65 :-)
      SendMessage(wh, WM_CHAR, Word(mystring[i]), 0);
    end;
    Windows.SetFocus(Handle); // Focus auf dein Prg.
  end else
    ShowMessage('Sorry, Window not found, start the Notepad pleace ?');
end;

Assun 24. Jun 2005 10:55

Re: Tasten senden problem
 
Ersterer Code funktioniert. letzerer aber nicht !

genau das ist mein Problem, denn ich habe bei GTA ja kein Editfeld ^^

turboPASCAL 24. Jun 2005 11:09

Re: Tasten senden problem
 
:gruebel: Wenn das Windowshandle/Fenstername stimmt?

Du solltest es einmal so Versuchen:

Delphi-Quellcode:
// an Stelle von
SendMessage(wh, WM_CHAR, Word(mystring[i]), 0);

//das:
SendMessage(wh, WM_KEYDOWN, Word(mystring[i]), 0);
SendMessage(wh, WM_KEYUP, Word(mystring[i]), 0);
also einen "echten" Testendruck simulieren (k.A. wie GTA die Tasten Events ausliest).

Assun 24. Jun 2005 11:15

Re: Tasten senden problem
 
also mit folgendem code schreibt er mir er findet GTA: San Andreas nicht !

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const
  mystring: string = 'LXGIWYL';
var
  wh: HWND;
  i: Integer;
begin
  wh := FindWindow('GTA: San Andreas', nil); // Window finden
  Windows.SetFocus(wh); // Focus auf das empfangende Prg. damit es auch Keys verarbeitet ?
  if wh <> 0 then
  begin
    for i := 1 to length(mystring) do
    begin
      // Word() oder Ord() - Hauptsache aus z.B. 'A' wird 65 :-)
      SendMessage(wh, WM_CHAR, Word(mystring[i]), 0);
    end;
    Windows.SetFocus(Handle); // Focus auf dein Prg.
  end else
    ShowMessage('Sorry, Window not found, start the Notepad pleace ?');
end;
obwohl in der TaskBar unten "GTA: San Andreas" steht. also heisst das window auch so oder ??

turboPASCAL 24. Jun 2005 13:37

Re: Tasten senden problem
 
Zitat:

obwohl in der TaskBar unten "GTA: San Andreas" steht. also heisst das window auch so oder ??
Nein, es kann ja auch "Grand Theft Auto San Andreas" heissen :mrgreen:


Im Taskmanager mal gucken nach was dort als Name angeg. ist.
(bitte keine Frage(n) zum Taskmanager, bei mir nicht in Benutzung, ich verwende den Process Explorer)

Assun 24. Jun 2005 15:51

Re: Tasten senden problem
 
der Name stimmt. ich bekomm nun auch keine errors mehr und er sagt mir net er hätte nix gefunden.

funtkioniern tuts trotzdem nicht.

PierreB 24. Jun 2005 17:54

Re: Tasten senden problem
 
Zitat:

Zitat von Assun
der Name stimmt. ich bekomm nun auch keine errors mehr und er sagt mir net er hätte nix gefunden.

funtkioniern tuts trotzdem nicht.

Wenn jetzt keine Fehler mehr kommen, liegt vielleicht daran das SA prüft ob diese Tasten gedrückt werden (der Cheat). Du drückst aber nicht die Tasten, sondern schickst den String direkt an das Programm. Ich kann mich auch irren aber kein Trainer auf dieser Welt funktioniert so und deshalb denke ich nicht das das so geht.

Assun 24. Jun 2005 18:08

Re: Tasten senden problem
 
naja also ich weiss ja dass man normal alles mit Hex Codes macht.

aber so mit dieser methode gings bei Vice City !

Luckie 24. Jun 2005 18:21

Re: Tasten senden problem
 
Zitat:

Zitat von Assun
Delphi-Quellcode:
  wh := FindWindow('GTA: San Andreas', nil); // Window finden

Bist du sicher dass du da nicht die parameter vertauschst?
Code:
HWND FindWindow(         
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName
);

Assun 26. Jun 2005 13:24

Re: Tasten senden problem
 
Es scheint daran zu liegen, dass es dem Spiel nicht genügt das ganze Wort zu "bekommen".

Vielmehr müsste ich jeden einzelnen Tastendruck simulieren. Also Buchstabe für Buchstabe.

Und das ist mir definitiv zu viel Arbeit ;-)

Vielen Dank an alle Helfer !

:thumb:


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