simulierte Mausklicks werden ignoriert



  • Ich simuliere für ein DirectX 9 Spiel einige Tastertureingaben und Mausklicks.
    Mit einem Tastendruck klappt das wunderbar. Nur simulierte Mausklicks werden vom Spiel gnadenlos ignoriert.

    Laut Spy++ kommen die Nachrichten beim Spiel an und es sollte eigentlich darauf reagieren.

    SendMessage(hwnd, WM_RBUTTONDOWN, 0, (LPARAM)MAKELPARAM(500, 200));
    SendMessage(hwnd, WM_RBUTTONUP, 0, (LPARAM)MAKELPARAM(500, 200));
    

    Die SendInput()- und mouse_event()-Funktionen scheiden aus, weil das ganze auch funktionieren soll wenn das Spiel keinen Fokus hat/nicht ontop ist.

    Mir ist in Spy++ aufgefallen das einige WM_INPUT messages mit irgendwelches Rohdaten versendet werden. Kommen die Messages eventl. von direct inpust API von DirectX?



  • Da ich immer mehr die Vermutung habe das DirectX dahinter steckt... andere Frage:

    Wie simuliert man Mausklicks per Direct Input?
    Soweit ich weiß verwendet Direct Input nicht das WIN API um Latenzen klein zu halten.


  • Mod

    SendInput funktioniert auch auf DirectX Level. Setzt aber voraus, dass die Anwendung top-level ist und den Focus hat.
    Es gibt keinen anderen Weg, der mir bekannt ist.

    Wenn SendInput ausscheidet, dann verabschide Dich von Deinem Projekt 😉



  • ich kann mich irren aber imho fängt directinput auch nur den rawinput auf.
    versuch mal die entsprechenden raw-messages zu senden



  • Nimm halt Auto IT ...

    Hier ein paar Befehle dafür

    Send("{Enter}")
    Sleep(500)
    Sleep(500)

    Sleep("7000")
    mouseclick ("left",498, 404)
    Sleep("3000")



  • @ Wa
    Für AutoIT gilt das gleiche wie für SendInput() und mouse_event(), das Fenster muss dafür on-top sein und den eingabefokus haben.

    @tippgeber
    Laut Spy++ empfäng das Spiel bei einem *echten* Mausklick ein bis zwei (ja es ist unterschiedlich, seltsam...) Messages mit rawinput neben den Buttundown und Buttonup-Messages. Nur leider weiß ich nicht was das für kryptische Zahlen innerhalb der Paramter sind ... dafür arbeite ich gerade durch ein DirectInput Tutrial.

    Einen kleinen Ansatz habe ich, aber der ist unschön weil er die gleiche Version der "dinput8.dll" vorraussetzt. Wenn man sich im DirectX SDK 'dinput.h' anschaut findet man:

    typedef struct _DIMOUSESTATE {
        LONG    lX;
        LONG    lY;
        LONG    lZ;
        BYTE    rgbButtons[4];
    } DIMOUSESTATE, *LPDIMOUSESTATE;
    

    In der Struktur wird gespeichert welche der vier Maustasten gedrückt ist.
    Wobei rgbButtons[0] die linke Maustaste ist und den Wert 128 hat wenn sie gedrückt ist, ansonnsten 0.

    Durchsucht man jetzt den Spielspeicher kann man ohne Probleme diese Struktur finden und Mausklicks simulieren indem man in rgbButtons[0] einfach eine 128 schreibt. Die Adresse der Struktur zu finden ist kein Problem, sie ist statisch in der DLL. Nur leider befinden sich in lX und lY nicht die Pixelcoordinaten des Cursor sondert extrem große Werte. Man kann damit anscheinend auch nicht die Cursorposition beeinflussen.

    Aber selbst wenn die Lösung funktionieren würde, die ist mir zu riskant ... es braucht nur eine andere Version der DLL auf dem Rechner sein und schon funktioniert es nicht mehr.

    Ich guck mir erstmal Direct Input noch genau an ... da muss es doch einen sauberen Weg geben.


Anmelden zum Antworten