none
[C++] Mausklick in einem DirectX Spiel simulieren RRS feed

  • Frage

  • Hallo,

    ich habe schon mit Spy++ rausgefunden, dass das Spiel bei einem Mausklick WM_INPUT Nachrichten erhält.

    Die Nachrichten werden außerdem per Postmessage übermittelt, nur bin ich noch nicht dahintergekommen wie ich solche Nachrichten verschicken kann.

    Ich habe schon probiert die Nachricht   PostMessage(hWnd, BM_CLICK, 0, 0);  oder auch PostMessage(hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(200,200)); zu versenden.

    Mit SendInput() habe ich es auch schon erfolglos versucht.

    Zudem habe ich noch mit z.B.   PostMessage(hWnd, WM_INPUT, 0, 0x0368070D);   probiert eine Nachricht nachzuahmen, aber leider zeigt sich das Spiel davon relativ unbeeindruckt.

    Vorallem verstehe ich nicht wie der Lparam Teil der WM_INPUT Nachricht (0x0368070D) gebildet wird. (Dieser ist immer anderes, obwohl ich die Maus nicht bewege.)

    Ich denke mal das dieser Wert der Schlüssel zu allem ist, da das Programm AutoHotKey die gleichen Nachrichten an das Spiel sendet und das auch funktioniert.

    Würde mich über Hilfe freuen

    MFG camelion3

    Mittwoch, 2. Februar 2011 00:09

Antworten

  • SendMessage und PostMessage können nicht für die Maus-Simulation herhalten.
    Verwende SendInput.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 11:23
    Moderator
  • Also ich bin nun nicht der Crack in Direct Input, aber http://msdn.microsoft.com/en-us/library/ee418998%28v=vs.85%29.aspx sagt "Because DirectInput works directly with the device drivers, it either suppresses or ignores Windows mouse and keyboard messages". Das könnte eine Erklärung dafür sein.
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 14:42
  • Es gibt doch den Source Code von AutoHotKey.
    Schau doch selbst rein, wie die es machen... ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 15:04
    Moderator
  • Die Lösung war doch relativ einfach.

    Wenn man die Zeile SetForegroundWindow(hWnd); aus dem Programm nimmt funktioniert alles zu meiner vollsten Zufriedenheit.

    Dieser Befehl hat immer dafür gesorgt, dass der Mausklick nicht an das Spiel gesendet wurde. Der Befehl bringt das Fenster nur in den Vordergrund aktiviert es aber nicht.

    Danke nochmal für die Hilfe.

    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:17
    Freitag, 4. Februar 2011 15:16

Alle Antworten

  • SendMessage und PostMessage können nicht für die Maus-Simulation herhalten.
    Verwende SendInput.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 11:23
    Moderator
  • Ich habe es schon mit SendInput() versucht und das Spiel bekommt auch die richtigen WM_INPUT Nachrichten, aber es reagiert nicht darauf.

    Hier mein Quellcode:

     

    HWND hWnd = FindWindow(0, "DIEmWin");
    if(hWnd != 0)

        SetForegroundWindow(hWnd); 


        INPUT MausKlick;

        MausKlick.type           = INPUT_MOUSE;
        MausKlick.mi.dwFlags     = MOUSEEVENTF_LEFTDOWN;

        SendInput(1, &MausKlick, sizeof(MausKlick));

        MausKlick.mi.dwFlags     = MOUSEEVENTF_LEFTUP;

        SendInput(1, &MausKlick, sizeof(MausKlick));
    }

    Mittwoch, 2. Februar 2011 14:17
  • Also ich bin nun nicht der Crack in Direct Input, aber http://msdn.microsoft.com/en-us/library/ee418998%28v=vs.85%29.aspx sagt "Because DirectInput works directly with the device drivers, it either suppresses or ignores Windows mouse and keyboard messages". Das könnte eine Erklärung dafür sein.
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 14:42
  • Das habe ich auch schon gedacht, aber das Programm AutoHotkey muss es ja auch irgendwie schaffen einen Mausklick zu simulieren.
    Mittwoch, 2. Februar 2011 14:48
  • Es gibt doch den Source Code von AutoHotKey.
    Schau doch selbst rein, wie die es machen... ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:08
    Mittwoch, 2. Februar 2011 15:04
    Moderator
  • Die Lösung war doch relativ einfach.

    Wenn man die Zeile SetForegroundWindow(hWnd); aus dem Programm nimmt funktioniert alles zu meiner vollsten Zufriedenheit.

    Dieser Befehl hat immer dafür gesorgt, dass der Mausklick nicht an das Spiel gesendet wurde. Der Befehl bringt das Fenster nur in den Vordergrund aktiviert es aber nicht.

    Danke nochmal für die Hilfe.

    • Als Antwort markiert camelion3 Freitag, 4. Februar 2011 15:17
    Freitag, 4. Februar 2011 15:16