Keyboard Inputs simulieren - verzweifle...



  • Guten Tag allerseits,

    Ich möchte lernen, Makros in C++ zu schreiben. Da ein Kumpel und ich abundzu mal Guild Wars spielen, dachte ich mir, schreibste doch mal ne automatisierung zum Üben. Prinipiell ist das auch kein Problem, denn die Funktionen, die ich dazu brauche habe ich bereits geschrieben. Zuerst habe ich das senden von Keystrokes mit der keybd_event Funktion probiert. Es ging alles gut, mein Programm konnte alles mögliche in eine Textdokument schreiben. Das Problem ist nur, dass im Spiel keine Hotkeys ausgelöst werden. Also es poppt ein Fenster im Spiel auf und normal drücke ich Enter um das wegzubekommen. Wenn ich das Enterdrücken mit meinem Programm machen möchte, so reagiert das Fenster im Spiel aber nicht. Jedes andere Fenster reagiert.. habe mal eine MessageBox kreiert und diese mittels des virtuellen Enterdrucks geschlossen. Dann dachte ich, dass liegt vielleicht daran, dass keybd_event veraltet ist. Daher benutze ich SendInput. Hier genau das selbe, im Textdokument wird alles geschrieben, allerdings reagiert das Spiel nicht auf die virtuelle Tasteneingabe. Ich habe alles mir mögliche getan, habe es in den Focus + Vordergrund gesetzt..

    targetHWND=FindWindowA(NULL,"Guild Wars");
        SetFocus(targetHWND);
        SetForegroundWindow(targetHWND);
    

    Dann habe ich es mit Attachments versucht:

    thisThread=GetCurrentThreadId();
        otherThread=GetWindowThreadProcessId(targetHWND,NULL);
    
        //Verbinden....
    
        if(!AttachThreadInput(thisThread,otherThread,true)) 
        {
        	MessageBoxA(0,"Mistake","Attachment failed",0);
        }
    

    Theoretisch funktioniert das auch alles, nur nicht im Spiel. Das Problem ist, ich habe mich jetzt richtig in das Problem reingesteigert und will das jetzt lösen, sonst kann ich nicht gut schlafen 🙂 Hier sind mal die Funktionen:

    void sendakey(int mykey)
    {
    
    	INPUT input[2];
        memset(input, 0, sizeof(input));
    	input[0].type = INPUT_KEYBOARD;
    
    	input[0].ki.wVk = mykey;
    	input[0].ki.dwFlags = 0;
    	input[0].ki.time = 0;
    	input[0].ki.dwExtraInfo = 0;
    
    	input[1].ki.wVk = mykey;
    	input[1].ki.dwFlags = KEYEVENTF_KEYUP;
    	input[1].ki.time = 0;
    	input[1].ki.dwExtraInfo = 0;
    
    	SendInput(2,input,sizeof(INPUT));
    }
    

    Hier die keybd_event Funktion:

    void sendkey(int key)
    {
         keybd_event(key, 0, 0, 0); 
         keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
    }
    

    Desweitern kennt bestimmt jeder die Scriptsprache AutoIt. Die Script die ich dort schreiben kann, funktionieren. Also sie schreiben Text und das Spiel reagiert auch auf die virtuellen Eingaben.
    Ich überlege, mir den Sourcecode runterzuladen und mir die Funktion einmal in C++ anzuschauen, nur weiss ich nicht ob das so legitim ist.

    Liebe Grüße



  • Hm, warum das nicht funktioniert, weiß ich nicht genau. Evtl könnte es helfen, wenn du erst ein Key-Down und dann ein Key-Up sendest 😕

    chris2k6 schrieb:

    Ich überlege, mir den Sourcecode runterzuladen und mir die Funktion einmal in C++ anzuschauen, nur weiss ich nicht ob das so legitim ist.

    Anschauen ist immer legitim (es sei denn du bist unter 18 und willst dir Pornos oder gewaltträchtige Filme ansehen) 🙂



  • Also ansehen und natürlich gucken wie die Funktion geht. Dann selbst zusammenbauen 😉

    Hier mal der MSDN Link zu der Inputstruct, vll mach ich ja was falsch ..

    http://msdn2.microsoft.com/en-us/library/ms646271.aspx

    So im au3 Sourcecode scheint zum einen die keybd_event Funktion benutzt zu werden, aber anscheinend noch was anderes, und zwar die PostMessage Funktion:

    http://msdn2.microsoft.com/en-us/library/ms644944.aspx

    Ist das auch eine Funktion wie keybd_event und SendInput? Denn ich durchblick diese Funktio nicht.



  • PostMessage ist eine Methode, mit der unter Windows Programme und auch das Betriebsystem miteinander kommunizieren. Es gibt relativ viele Messages, die man mittels der Funktionen Post/SendMessage versenden kann, darunter fallen auch Emulationen von Maus- und Tastatureingaben.

    Hier wird ganz gut noch der Unterschied zwischen Post- und SendMessage beschrieben:
    http://www.microsoft.com/germany/msdn/library/windows/SoWerdenInWindowsNachrichtenVersandt.mspx?mfr=true

    Egtl gehört der Thread eher ins WinAPI Forum würde ich sagen...



  • Then move plx



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ 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.



  • noNeed 4 aNick schrieb:

    PostMessage ist eine Methode, mit der unter Windows Programme und auch das Betriebsystem miteinander kommunizieren. Es gibt relativ viele Messages, die man mittels der Funktionen Post/SendMessage versenden kann, darunter fallen auch Emulationen von Maus- und Tastatureingaben.

    Hier wird ganz gut noch der Unterschied zwischen Post- und SendMessage beschrieben:
    http://www.microsoft.com/germany/msdn/library/windows/SoWerdenInWindowsNachrichtenVersandt.mspx?mfr=true

    Egtl gehört der Thread eher ins WinAPI Forum würde ich sagen...

    Da steht zwar, dass man PostMessage zum Simulieren von Eingaben benutzen kann, aber nicht wie. In der FUnktionserklärung auch nicht: http://msdn2.microsoft.com/en-us/library/Aa923831.aspx#Mtps_DropDownFilterText

    Kann jemand helfen?



  • Da kenne ich auch ein Spiel....
    Bei mir hat es nicht funktioniert, aber mit so einem kleinen Autoit Skript ⚠

    Leider weiß ich nicht, wo ihr gerade seid, aber wo genau kann man sich den Source Code herunterladen?
    Ich finde den nicht...

    Dann könnte ich mir das auch einmal angucken 😉



  • au3: weiss nicht mehr genau welche File die beste war, aber hier:

    http://www.autoitscript.com/autoit3/files/beta/autoit/

    AutoHotKey:

    http://www.autohotkey.com/download/AutoHotkey_source.exe

    Danke fürs Engagement 🙂



  • Könnte es vielleicht daran liegen, dass ich einen Hardwarecheck machen muss? Also bei der keybd_event Funktion. Das ist das einzige was mir noch einfällt.



  • Für die Nachwelt:

    Nach einigem rumprobieren bin ich mit Hilfe einer sehr klugen Person zu dem Schluss gekommen, dass GW nur Inputs vom Gerätetreiber akzeptiert. Windows Inputs werden geblockt.


Anmelden zum Antworten