Jak przesuwać kursor myszy za pomocą C #?

81

Chcę symulować ruch myszy co x sekund. W tym celu użyję licznika czasu (x sekund), a kiedy zegar tyka, wykonam ruch myszy.

Ale jak mogę przesuwać kursor myszy za pomocą C #?

aF.
źródło
3
To brzmi jak połowiczne rozwiązanie problemu, o którym nam nie mówisz, który prawdopodobnie ma bardziej eleganckie rozwiązania.
Damien_The_Unbeliever
To całkiem możliwe! Nie rozumiemy dlaczego, ale wygaszacz ekranu włącza się po 10 minutach. Ale postawiliśmy 999 minut: P
aF.
3
W takim razie powinieneś poszukać rozwiązań, które uniemożliwiają aktywację wygaszacza ekranu, gdy aplikacja jest uruchomiona, zamiast bawić się myszą lub ustawieniami wygaszacza ekranu. Np. P / Invoke SetThreadExecutionState . Podejrzewałem, że jest to związane z wygaszaczem ekranu - zaprogramowane ruchy myszy nie resetują licznika czasu wygaszacza ekranu.
Damien_The_Unbeliever

Odpowiedzi:

87

Spójrz na Cursor.Positionnieruchomość . To powinno zacząć.

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
źródło
1
Dzięki @JamesHill, nie pamiętam, jak to zrobić, a twój przykład jest doskonały. W moim przypadku dodałem kilka obliczeń do xiy, aby powiązać czas ruchu myszy (piksel na sekundę)
Pimenta
2
Czy to podejście do WinForms?
greenoldman
14
Czuję, że powinienem o tym wspomnieć, aby ktoś nie wpadł w przezabawny problem, który właśnie miałem. Cursor.Clipograniczy ruch myszy do rozmiaru określonego przez Locationi Size. Tak więc powyższy fragment pozwoli twojej myszy poruszać się tylko w obwiedni aplikacji.
Brandon
Cursor.Positionmoże wymagać określonego ustawienia, jeśli jest używany na maszynie wirtualnej .
Pollitzer
Działa dobrze, a jeśli linia Cursor.Clip zostanie usunięta, działa również, gdy okno jest zminimalizowane.
Ben
33

Najpierw dodaj klasę o nazwie Win32.cs

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;
        }
    }
}

Możesz go wtedy użyć w ten sposób:

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

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);
user3290286
źródło
Również w WinForm możesz użyć Cursor.Position = new Point (x, y);
user3290286
skąd pochodzi POINT Type?
RollRoll
Jak uzyskać pozycję kursora myszy za pomocą tej metody?
barlop
to dobrze ... należy zauważyć, że jest to odniesione do lewego górnego rogu formularza. Są to więc te same współrzędne używane np. Przez kontrolkę w formularzu i te same współrzędne użyte w (i - odpowiadając na moje q w moim komentarzu powyżej - które można uzyskać), MouseEventArgs e, np. Metody MouseMove Forma.
Barlop