Wie bewege ich den Mauszeiger mit C #?

81

Ich möchte alle x Sekunden eine Mausbewegung simulieren. Dafür verwende ich einen Timer (x Sekunden) und wenn der Timer tickt, mache ich die Mausbewegung.

Aber wie kann ich den Mauszeiger mit C # bewegen?

aF.
quelle
3
Das klingt nach einer halben Lösung für ein Problem, von dem Sie uns nicht erzählen, das wahrscheinlich elegantere Lösungen bietet.
Damien_The_Unbeliever
Es ist durchaus möglich! Wir verstehen nicht warum, aber der Bildschirmschoner wird nach 10 Minuten aktiviert. Aber wir setzen 999 Minuten: P
aF.
3
Dann sollten Sie nach Lösungen suchen, die verhindern, dass der Bildschirmschoner aktiviert wird, wenn Ihre Anwendung ausgeführt wird, anstatt mit der Maus oder den Bildschirmschonereinstellungen herumzuspielen. ZB P / Invoke SetThreadExecutionState . Ich vermutete, dass dies mit dem Bildschirmschoner zusammenhängt - programmierte Mausbewegungen setzen den Bildschirmschoner-Timer nicht zurück.
Damien_The_Unbeliever

Antworten:

86

Schauen Sie sich die Cursor.PositionImmobilie an . Es sollte Ihnen den Einstieg erleichtern.

private void MoveCursor()
{
   // Set the Current cursor, move the cursor's Position,
   // and set its clipping rectangle to the form. 

   this.Cursor = new Cursor(Cursor.Current.Handle);
   Cursor.Position = new Point(Cursor.Position.X - 50, Cursor.Position.Y - 50);
   Cursor.Clip = new Rectangle(this.Location, this.Size);
}
James Hill
quelle
1
Danke @JamesHill, ich habe mich nicht daran erinnert, wie das geht und dein Beispiel ist ausgezeichnet. In meinem Fall habe ich einige Berechnungen zu x und y hinzugefügt, um die Mausbewegungszeit zeitabhängig zu machen (Pixel pro Sekunde)
Pimenta
2
Ist das WinForms-Ansatz?
Greenoldman
14
Ich habe das Gefühl, ich sollte das erwähnen, damit jemand nicht in das komische Problem gerät, das ich gerade hatte. Cursor.Clipbeschränkt die Bewegung Ihrer Maus auf die durch Locationund angegebene Größe Size. Mit dem obigen Snippet kann sich Ihre Maus also nur innerhalb des Begrenzungsrahmens der Anwendung bewegen.
Brandon
Cursor.PositionMöglicherweise ist eine bestimmte Einstellung erforderlich, wenn sie in einer virtuellen Maschine verwendet wird .
Pollitzer
Funktioniert einwandfrei, und wenn die Cursor.Clip-Zeile entfernt wird, funktioniert sie auch, wenn das Fenster minimiert ist.
Ben
31

Fügen Sie zuerst eine Klasse mit dem Namen Win32.cs hinzu

public class Win32
{ 
    [DllImport("User32.Dll")]
    public static extern long SetCursorPos(int x, int y);

    [DllImport("User32.Dll")]
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;

        public POINT(int X, int Y)
        {
            x = X;
            y = Y;
        }
    }
}

Sie können es dann so verwenden:

Win32.POINT p = new Win32.POINT(xPos, yPos);

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);
user3290286
quelle
Auch in WinForm können Sie Cursor.Position = new Point (x, y) verwenden;
user3290286
Woher kommt der POINT-Typ?
RollRoll
Wie erhält man mit dieser Methode die Mauszeigerposition?
Barlop
Das ist gut. Es ist zu beachten, dass dies relativ links oben im Formular ist. Es sind also die gleichen Koordinaten, die z. B. von einem Steuerelement in einem Formular verwendet werden, und die gleichen Koordinaten, die in (und - um mein q in meinem obigen Kommentar zu beantworten - die MouseEventArgs e, z. B. der MouseMove-Methode von Form, abgerufen werden können.
Barlop