Эмуляция плавного движения мышки (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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д