Эмуляция плавного движения мышки (C#, WinAPI)

Узнай цену своей работы

Формулировка задачи:

Есть класс MouseOperations, основан на WinAPI. Все отлично работает, вот только движения мышки не плавные (она просто пропадает в одном месте и появляется уже в заданном). Как сделать прорисовку движения мышки? Сам класс:
using System;
using System.Runtime.InteropServices;
 
public class MouseOperations
{
    [Flags]
    public enum MouseEventFlags
    {
        LeftDown = 0x00000002,
        LeftUp = 0x00000004,
        MiddleDown = 0x00000020,
        MiddleUp = 0x00000040,
        Move = 0x00000001,
        Absolute = 0x00008000,
        RightDown = 0x00000008,
        RightUp = 0x00000010
    }
 
    [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetCursorPos(int X, int Y);
 
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(out MousePoint lpMousePoint);
 
    [DllImport("user32.dll")]
    private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 
    public static void SetCursorPosition(int X, int Y)
    {
        SetCursorPos(X, Y);
    }
 
    public static void SetCursorPosition(MousePoint point)
    {
        SetCursorPos(point.X, point.Y);
    }
 
    public static MousePoint GetCursorPosition()
    {
        MousePoint currentMousePoint;
        var gotPoint = GetCursorPos(out currentMousePoint);
        if (!gotPoint) { currentMousePoint = new MousePoint(0, 0); }
        return currentMousePoint;
    }
 
    public static void MouseEvent(MouseEventFlags value)
    {
        MousePoint position = GetCursorPosition();
 
        mouse_event
            ((int)value,
             position.X,
             position.Y,
             0,
             0);
    }
 
    [StructLayout(LayoutKind.Sequential)]
    public struct MousePoint
    {
        public int X;
        public int Y;
 
        public MousePoint(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
}
Вопрос закрыт. Друг подсказал решение.

Решение задачи: «Эмуляция плавного движения мышки (C#, WinAPI)»

textual
Листинг программы
// Получаем разность координат
                            int MouseSpeed = 3;
                            int CountX = 0;
                            int CountY = 0;
 
                            if (XStart > XEnd)
                            {
                                CountX = XStart - XEnd;
                            }
                            else if (XStart < XEnd)
                            {
                                CountX = XStart - XEnd;
                            }
                            else if (XStart == XEnd)
                            {
                                CountX = 0;
                            }
 
                            if (YStart > XEnd)
                            {
                                CountY = YStart - YEnd;
                            }
                            else if (YStart < XEnd)
                            {
                                CountY = YStart - YEnd;
                            }
                            else if (YStart == XEnd)
                            {
                                CountY = 0;
                            }
 
                            // Перемещение по оси X
                            if (CountX > 0)
                            {
                                for (int i = 0; i < CountX; i++)
                                {
                                    MouseOperations.SetCursorPosition(XStart - i, YStart);
                                    Thread.Sleep(MouseSpeed);
                                }
                            }
                            else if (CountX < 0)
                            {
                                string source = CountX.ToString().Replace("-", "");
                                for (int i = 0; i < int.Parse(source); i++)
                                {
                                    MouseOperations.SetCursorPosition(XStart + i, YStart);
                                    Thread.Sleep(MouseSpeed);
                                }
                            }
                            else if (CountX == 0)
                            {
                                MouseOperations.SetCursorPosition(XStart, YStart);
                                Thread.Sleep(MouseSpeed);
                            }
 
                            // Перемещение по оси Y
                            if (CountY > 0)
                            {
                                for (int i = 0; i < CountY; i++)
                                {
                                    MouseOperations.SetCursorPosition(XEnd, YStart - i);
                                    Thread.Sleep(MouseSpeed);
                                }
                            }
                            else if (CountY < 0)
                            {
                                string source = CountY.ToString().Replace("-", "");
                                for (int i = 0; i < int.Parse(source); i++)
                                {
                                    MouseOperations.SetCursorPosition(XEnd, YStart + i);
                                    Thread.Sleep(MouseSpeed);
                                }
                            }
                            else if (CountY == 0)
                            {
                                MouseOperations.SetCursorPosition(XEnd, YStart);
                                Thread.Sleep(MouseSpeed);
                            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы