Як перемістити курсор миші за допомогою C #?


81

Я хочу імітувати рух миші кожні х секунд. Для цього я використаю таймер (х секунд), а коли таймер відмітиться, я здійсню рух миші.

Але як я можу змусити курсор миші рухатись за допомогою C #?


3
Це звучить як напіврозв'язок проблеми, про яку ви нам не розповідаєте, яка, ймовірно, має більш елегантні рішення.
— Damien_The_Unbeliever

Це цілком можливо! Ми не розуміємо, чому, але заставка активується через 10 хвилин. Але ми ставимо 999 хвилин: P
— aF.

3
Тоді вам слід шукати рішення, які заважають активувати заставку під час запуску вашої програми, а не возитися з мишею чи налаштуваннями заставки. Наприклад, P / Invoke SetThreadExecutionState . Я підозрював, що це пов’язано із заставкою - запрограмовані рухи миші не скидають таймер заставки.
— Damien_The_Unbeliever

Відповіді:


87

Погляньте на Cursor.Positionнерухомість . Це повинно допомогти вам почати.

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
Дякую @JamesHill, я не пам’ятав, як це зробити, і ваш приклад чудовий. У моєму випадку я додав кілька обчислень до x та y, щоб встановити час руху миші (піксель в секунду)
— Pimenta,

2
Це підхід WinForms?
— greenoldman

14
Я відчуваю, що я повинен згадати про це, щоб хтось не потрапив у веселу проблему, яку я щойно мала. Cursor.Clipобмежить рух вашої миші до розміру, вказаного Locationі Size. Отже, наведений вище фрагмент дозволить вашій миші рухатись лише в межах рамки програми.
— Брендон

Cursor.Positionможе знадобитися певне налаштування, якщо воно використовується у віртуальній машині .
— Полліцер

Працює нормально, і якщо рядок Cursor.Clip видалено, він також працює, коли вікно згорнуто.
— Бен,

33

Спочатку додайте клас під назвою 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;
        }
    }
}

Ви можете використовувати його тоді так:

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

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);

Також у WinForm ви можете використовувати Cursor.Position = new Point (x, y);
— user3290286

звідки тип POINT?
— RollRoll

Як отримати позицію курсору миші за допомогою цього методу?
— barlop

це добре .. слід зазначити, що це відносно верхнього лівого кута форми. Отже, це ті самі координати, що використовуються, наприклад, елементом керування у формі, і ті самі координати, що використовуються у (і - щоб відповісти на моє запитання q у моєму коментарі вище - це можна отримати з), MouseEventArgs e, наприклад методу MouseMove форми.
— barlop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.