Benutzer mit den meisten Antworten
[C++] Mausklick in einem DirectX Spiel simulieren

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
Antworten
-
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
-
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
Alle Antworten
-
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));
} -
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
-
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