Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.03.2010, 08:00

Tastendruck bei einem Spiel simulieren?

Hallo,

...da schaut man mal ein paar tage nicht vorbei und schon ändert sich die ganze Seite. :D
Schön geworden. :)

So, zu meinem Problem, undzwar möchte arbeite ich an einem Bot mit künstlicher Intilligenz,
weil ich denke das ich aus sonem Projekt auch für meine Spiele Erfahrung mitnehmen kann.
Keine Angst, es handelt sich um ein Single Player Spiel. ;)

Leider funktioniert das ganze aber nicht so leicht...
Undzwar hab ich es so versucht:

C-/C++-Quelltext

1
2
3
HWND hWnd = FindWindow(L"D3D Window", L"Game");
         SetForegroundWindow(hWnd);
        keybd_event(0x57, 0x57, 0, 0); //W


Das ganze funktioniert aber nicht, es funktioniert nur im Editor..
Dann wollt ich der Sache auf den Grund gehen, als erstes hab ich mir gedacht
ob vielleicht die taste nicht lang gedrückt wird und hab es dann einfach
brutal mit einer while Schleife versucht, um zu gucken obs überhaupt geht...
ohne erfolg.. dann hab ich mit spy++ mir mal das handle genauer angeschaut...
hab gemerkt das der Klassenname D3D Window heißt.. und wenn ich mich nicht
irre soll das für DirectX 3D stehen und soweit ich weiß holt sich Direct Input über einen
anderen Weg die eingaben von der Tastatur..

Nunja.. und hier bleib ich hengen... wie soll ich denn jetzt an das Handle den Tastendruck
senden? Googeln hat mir auch nicht wirklich geholfen.

Ich hoffe das mir da jemand behilflich sein kann. :)
Lg Genro

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

31.03.2010, 08:12

Auf niedrigerer Ebene geht das mit den Funktionen keybd_event und mouse_event (für Mausbewegungen und Klicks). Siehe MSDN! Auf Vista und Windows 7 musst du beachten, dass dein Prozess mit Administratorrechten laufen muss, sonst funktioniert das "Einspeisen" von Events nicht.
Ich habe mir mit dieser Methode schon einige "Makros" für Spiele gebaut. Funktioniert auf jeden Fall.

3

31.03.2010, 08:30

Danke schonmal,
Ich hab jetzt so wie du es gesagt hast das Programm per "Rechtsklick->Als Administrator ausführen"
es mit Administratorrechten ausgeführt...
Sei mir nicht böse,.. aber leider funktioniert das irgendwie nicht..

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.03.2010, 08:41

Quelltext or it didn't happen! ;)

5

31.03.2010, 08:47

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HWND hWnd = FindWindow(L"D3D Window", L"Game");
        SetForegroundWindow(hWnd);

        keybd_event(0x57, 0x57, 0, 0);  //W
        sf::Sleep(1.0); 
cout <<"W wurde im Spiel gedrückt!\n";

        keybd_event(0x53, 0x53, 0, 0);  //S
        sf::Sleep(1.0); 
cout <<"S wurde im Spiel gedrückt!\n";

        keybd_event(0x41, 0x41, 0, 0);  //A
        sf::Sleep(1.0); 
cout <<"A wurde im Spiel gedrückt!\n";

        keybd_event(0x44, 0x44, 0, 0);  //D
        sf::Sleep(1.0); 
cout <<"D wurde im Spiel gedrückt!\n";
        cout <<"Test wurde beendet!\n";


Der Rest ist eigentlich unwichtig..

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

31.03.2010, 10:21

Da fehlt was.
Du musst sowohl das Runterdrücken als auch das Loslassen der Tasten simulieren!
Also 2x keybd_event aufrufen.
Steht aber auch auf der MSDN-Seite.

7

31.03.2010, 11:27

Ok, habe ich gemacht.. also

C-/C++-Quelltext

1
2
3
        keybd_event(0x57, 0x57, KEYEVENTF_EXTENDEDKEY | 0, 0);  //W
        keybd_event(0x57, 0x57, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); 
//etc.


aber funktioniert auch nicht... habs auch mit als admin ausführen probiert, was auch nicht geht...
Ich hab auch das gemacht:

C-/C++-Quelltext

1
2
3
        keybd_event(0x57, 0x57, KEYEVENTF_EXTENDEDKEY | 0, 0);  //W
        sf::Sleep(1.0); cout <<"W wurde im Spiel gedrueckt!\n";
        keybd_event(0x57, 0x57, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

auch leider erfolglos.. aber im editor funktionierts perfekt..

Task-Manager

Alter Hase

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

8

31.03.2010, 12:27

hmm hatte sowas mal gemacht um ein WoW-Bot zu schreiben hatte eigentlich ganz gut mit keybd_event funktioniert :S
sicher das du dir das Handle vom Fenster besorgt hast? (in dem du die Tasten simulieren willst...)
ich gehe mal davon aus, dass es im Editor klappt, weil du das Fenster erstellt hast. Aber die anderen Fenster muss du dir "herholen" bei Wow muste ich das Fenster suchen, es in den Vordergrund schieben UND mir das Handle besorgen.

dann dürfte es gehen :D

Wenn du aber ein Bot schreiben willst ist das aber ne gefährliche Sache, die Tastatureingaben findet Warden z.B. nicht, aber ich hab hinweise darauf gefunden, dass wenn du bestimmte Speicherbereiche vom Game ausliest, dass Warden Alarm schlagen will. Ich hab einfach die Farbcodes vom Fenster gescannt, war aufwendiger, aber absolut sicher :thumbup:
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

9

31.03.2010, 16:50

Ich hätte wohl mehr zu meiner handelsweise sagen müssen, undzwar öffne ich das Programm,
das programm ruft das Spiel in den Vordergrund und sendet die Tasten an das Spiel.. was jedoch nicht
reagiert.. da es nicht funktioniert hat, hab ich den Editor von Microsoft der schon druf ist geöffnet und an
den Zeitpunkt wo die Tasten per keybd_event gesendet werden ins TextFeld gedrückt, so wurden dann
halt die tasten reingeschrieben also "w, a, s, d"..
Das meinte ich mit dem Editor..

Ich schiebe das Spiel ja auch in den Vordergrund, es ist übrigens im Fenstermodus, .. was meinste mit Handle
besorgen... das tuh ich doch schon..? Ich Suche das Fenster mit FindWindow schiebe es in den Vordergrund..
und das ist ja schon das Handle, also hWnd..?
Also:

C-/C++-Quelltext

1
2
3
4
5
        HWND hWnd = FindWindow(L"D3D Window", L"Game"); //Das Handle wenn ich mich net irre..
        SetForegroundWindow(hWnd); //Hier wirds in den Vordergrund gesetzt.
        keybd_event(0x57, 0x57, 0, 0);  //W
        sf::Sleep(1.0); cout <<"W wurde im Spiel gedrueckt!\n";
        keybd_event(0x57, 0x57, KEYEVENTF_KEYUP, 0);


..ich hab versucht indem ich in eine textbox vom spiel klicke zu prüfen ob das Spiel überhaupt
die Tasten kriegt... auch ohne erfolg.. was irgendwie komisch ist..
Das einziges was funktioniert ist das dass Fenster in den Vordergrund gesetzt wird wenn
es das nicht schon ist..

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

10

31.03.2010, 17:00

Gibt es nicht Programme die soetwas blocken? Vielleicht liegt es daran ;)
WIP Website: kevinheese.de

Werbeanzeige