Probleme mit keybd_event
-
Hi,
ich hab ein Problem mit keybd_event. Ich versuche an ein Spiel strg+v zu senden. Die Daten kriege ich aus einem Editfeld und wird bevor das Paste passiert in die Zwischenablage kopiert - was soweit auch funktioniert. Bevor ich die Daten aus den Editfeldern auslesen, prüfe ich Checkboxen ob sie getickt sind mittels dynamic_cast und dann werden die Felder auch ausgelesen. Das prüfen der getickten Checkboxen und das Kopieren der Editfelder in die Zwischenablage kopieren funktioniert fehlerfrei. Das Problem liegt an dem Senden der Daten an das Spiel. Hierbei gehe ich so vor das ich im Spiel ENTER drücke, dann STRG+V und dann wieder ENTER. (Es handelt sich hierbei um Chatmacros wo ich keine Lust hab diese immer von Hand einzugeben, da diese fehlerhaft in einer Datei gespeichert werden wenn das Spiel beendet und somit eine Neueingabe erfordert und das möchte ich mir eben verkürzen).
Das witzige daran ist, wenn ich im Code ein Sleep einfüge läuft der Schleifenzähler weiter, d.h. wenn ich z.B. 10 Editfelder habe, wird dann innerhalb der Schleife (?) nur jedes 2te genommen (bzw. der Inhalt, sozusagen Editfeld 1,3,5,7,9 und die restlichen werden "ausgelassen" und genau hier liegt mein Problem. Wenn ich es ohne Sleep mach krieg ich eine Fehlermeldung vom Clipboard das nicht geöffnet werden kann. Also musste ich hier schon mal ein Sleep nehmen, dann hat zumindest das geklappt.
So wie ich es Codemässig gemacht habe könnt ihr unten entnehmen. Ich möchte noch hierbei erwähnen, dass das mit MapVirtualKey mein letzter Test war wo ich versucht habe es zum funktionieren zu kriegen, leider ohne Erfolg. Achja, das hwd innerhalb der Schleife um das Spiel dem Focus zu geben hat auch nicht geholfen, ich denke das Problem liegt wo anders.
Achja, debuggen kann ich nicht , wenn das Spiel läuft nicht da die Anticheat Software das verhindert. Das Interessante hierbei ist auch, dass es in einem normalen Windowsprogramm astrein funktioniert - nur im Spiel zickt es.
Ich brauche hilfe, ich versuch das schon seit 3 Tagen und ich krieg es einfach nicht hin, Ideen hab ich auch keine mehr die ich noch versuchen kann.
keybd_event hab ich auch normal aufgerufen (ohne Mapvirtualkey) und die Taste(n) lass ich auch los

int i; AnsiString temp, temp2; HWND hwnd = FindWindow(NULL, "MU"); SetForegroundWindow(hwnd); for (i=1;i<10+1;i++) { if (dynamic_cast<TCheckBox*>(FindComponent("chkBoxMacro"+String(i)))->Checked == true) { if (i==10) { temp2 = dynamic_cast <TEdit*>(FindComponent("edtMacro"+String(i)))->Text; temp.sprintf("/%d %s", 0, temp2); Clipboard()->AsText = temp; keybd_event(0xD, 0, 0, NULL); keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); keybd_event(0x56,MapVirtualKey(0x56,0),0,0); keybd_event(0x56,MapVirtualKey(0x56,0),KEYEVENTF_KEYUP,0); keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0); keybd_event(0xD, 0, KEYEVENTF_KEYUP, 0); Sleep(30); Clipboard()->Clear(); } else { temp2 = dynamic_cast <TEdit*>(FindComponent("edtMacro"+String(i)))->Text; temp.sprintf("/%d %s", i, temp2); Clipboard()->AsText = temp; keybd_event(0xD, 0, 0, NULL); keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); keybd_event(0x56,MapVirtualKey(0x56,0),0,0); keybd_event(0x56,MapVirtualKey(0x56,0),KEYEVENTF_KEYUP,0); keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0); keybd_event(0xD, 0, KEYEVENTF_KEYUP, 0); Sleep(30); Clipboard()->Clear(); } } }Ein weiteres Problem habe ich, wenn ich im Spiel ALT+1-9 drücken möchte - hier sollten normalerweise dann die Macros im Spiel "aktiviert" werden, dass funktioniert aber auch nicht

int i; int tmp[10]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30}; HWND hwnd = FindWindow(NULL, "MU"); SetForegroundWindow(hwnd); for (i=1;i<10+1;i++) { if (dynamic_cast<TCheckBox*>(FindComponent("chkBoxMacro"+String(i)))->Checked == true) { keybd_event(0x12, 0, 0, NULL); keybd_event(tmp[i], 0, 0, NULL); keybd_event(tmp[i], 0, KEYEVENTF_KEYUP, 0); keybd_event(0x12, 0, KEYEVENTF_KEYUP, 0); } }Wo liegt der Hund begraben? Was mach ich falsch? Im übrigen, keybd_event funktioniert definitiv im Spiel da ich ein anderes Programm habe was auch keybd_event benutzt, nur halt nicht in der Forum wie ich es versuche zu schreiben. D.h. drücken von diversen Tasten ist möglich.
Danke für die Anteilnahme!

-
Ich komm mir ignoriert vor, irgend jemand muss doch noch eine Idee haben

-
Ich vermute einfach mal, dass Du einen DirectX-Hook brauchst, um die Tastendrücke zu simulieren. Ich kann mir nicht vorstellen, dass Spiele einfach den Tastaturpuffer verwenden.
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Joe_M. schrieb:
Ich vermute einfach mal, dass Du einen DirectX-Hook brauchst, um die Tastendrücke zu simulieren. Ich kann mir nicht vorstellen, dass Spiele einfach den Tastaturpuffer verwenden.
Ich hab halt nur das Problem, dass ich irgendwo eine verzögerung einbauen kann damit die Tasten gedrückt werden. Prinzipiell funktioniert es ja auch, nur werden halt paar Tasten bzw. Eingaben übersprungen wenn ich Sleep einbaue, da, wie oben schon geschrieben der Schleifenzähler dann rumspinnt.
-
Hallo,
Sleep hällt das Programm an und verhindert jede weitere eingabe! Ich weiß nich so wirklich auf was du hinauswillst! Aber vielleicht hilft dir Application->ProcessMessages...
mfg, Micha!
-
Aber wieso springt der Schleifenzähler dann weiter? Ich verstehe es nicht. Application->ProcessMessages hab ich schon probiert, hilft auch nicht.
Mir würde es ja schon reichen wenn ich eine verzögerung einbauen kann, nur hab ich keine Idee wie ich das realisieren kann.
Hat jemand eine Idee bzw. Tip?
-
So, also ich hab das jetzt paar Tage ruhen lassen, habe es trotzdem noch nicht hinbekommen

Ich hab mal wieder mit AutoIt rumgespielt, dabei hab ich gesehen das die eine Funktion "Send" haben, damit wird der komplette String gesendet, ohne Zwischenablage (also nicht so wie ich es gemacht habe bzw. machen wollte).
Send("{ENTER}")
sleep(200)
Send("*zu sendener string*")
Send("{ENTER}")Weitaus komfortabler und ohne STRG+V. Hat jemand eine Idee wie die das mit Send gemacht haben könnten?