Эмуляция плавного движения мышки (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);
}