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.