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 #?


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.