2012-03-30 9 views
0

Ich bewege die Maus mit INPUT, um die Cursorposition festzulegen. Das ist in Ordnung, außer dass ich keine Bildschirmwerte verwenden kann, um den Cursor zu bewegen. Wenn ich den Cursor von 0 bis 1680 setzen möchte, muss ich 1680 * 0,66 als dx Wert verwenden, um die richtige Position (im Spiel oder auf dem Desktop) zu bekommen.INPUT_MOUSE: Maus bewegt sich nicht mit gegebenen dx/dy-Werten

(ich benutze mousemove-, wie ich in einem Spiel die Cursor-Position am Einstellung und absolute Positionierung funktioniert nicht da. Ich habe zwei Bildschirme, ein 1680 breit, das andere hat 1280)

Jede Idee Warum muss ich diesen Faktor verwenden oder woher kommt er? Danke.

#define MOUSE_MOVE_FACTOR 0.6619 

     //Set mouse pos: 
     void setMousePos(int iX, int iY){ 


      iX = (int)((double)iX*MOUSE_MOVE_FACTOR); 
      iY = (int)((double)iY*MOUSE_MOVE_FACTOR); 


      INPUT *buffer = new INPUT[1]; 

      buffer->type = INPUT_MOUSE; 
      buffer->mi.dx = iX; 
      buffer->mi.dy = iY; 
      buffer->mi.mouseData = 0; 
      buffer->mi.dwFlags = MOUSEEVENTF_MOVE; 
      buffer->mi.time = 0; 
      buffer->mi.dwExtraInfo = 0; 

      SendInput(1,buffer,sizeof(INPUT)); 

      Sleep(100 + (rand() % 50)); 

     } 
+1

Kann ich "Memory Leak" sagen? – Puppy

+0

Woher wissen Sie, dass Sie diesen Faktor verwenden müssen? Hast du gerade eine Zufallsnummer gefunden? – josephthomas

+0

Spiele ändern oft den Videomodus. –

Antwort

0

Wahrscheinlich hat etwas mit Mausbeschleunigung zu tun. Deaktivierung führt zu unterschiedlichen Mauspositionen.

0

Speicherlecks können Ihrer Anwendung seltsame Dinge zufügen, was einen Einfluss haben kann.

Sie verursachen einen Speicher jedes Mal auslaufen diese Funktion von Ihrer zweiten Zuteilung von buffer bei

buffer = new INPUT[1];

+0

Ich habe es nur mit einem Anruf versucht, keine Änderung – Ilyssis

0

Gemäß der Dokumention auf MOUSEINPUT, dx/dy sind relative Koordinaten aufgerufen wird, wenn MOUSEEVENTF_ABSOLUTE nicht gesetzt in dwFlags. Versuchen Sie:

buffer->mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 

und sehen, ob das funktioniert. Beachten Sie, dass Sie die X/Y in normalisierte absolute Koordinaten von 0-65535 konvertieren müssen, wie die Dokumentation erwähnt.

Ich würde auch fragen, warum Sie zuerst die Position auf (-3000, -3000) setzen. Ich würde auch vermuten, dass Sie den magischen Faktor von MOUSE_MOVE_FACTOR nicht brauchen, der wahrscheinlich auf das Vermischen von relativen/absoluten Mauskoordinaten zurückzuführen ist.

Edit: Re-Lesen Sie Ihre Frage und ich habe verpasst, dass Sie absichtlich relative Mausposition verwenden. Ich nehme an, dass Ihre absolute Positionierung möglicherweise fehlgeschlagen ist, weil Sie keine normalisierte absolute Koordinate verwendet haben (ich hätte das selbst nicht erraten, ohne die gesamte Dokumentation zu lesen). Beachten Sie auch, dass 1680x0.66 = 1109, die verdächtig nahe bei 1024 ist und ich könnte vermuten, dass das Spiel bei einem 1024x läuft? Auflösung.

+0

Ja, absolute Positionierung funktioniert hier nicht, da das Spiel nur nach Bewegungen sucht. Das Spiel läuft auch in 1680x1050. Allerdings macht es keinen Unterschied, ob ich im Spiel oder auf dem Desktop bin. – Ilyssis

+0

Hmm, seltsam dann. Laut der Dokumentation sollte die Position in Pixeln sein und ich kann mir nichts vorstellen, was einen konstanten Faktor wie diesen mit sich bringen würde. – uesp