Як перемістити курсор миші за допомогою 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.