имитация перемещения курсора мыши в c# между двумя координатами
Я пытаюсь программно перемещать мышь между двумя координатами.
Но я хочу поддерживать скорость надежно на всех быстрых или медленных обрабатывающих машинах.
Я видел Эту ссылку здесь. Но это не гарантирует мне оптимальную, плавную и видимую скорость курсора при моделировании перемещения между двумя координатами. Интересно, знает ли кто-нибудь трюк, чтобы определить параметры, такие как задержка и шаги оптимальное значение для различных машин, как моя первая идея была использовать for-loop для конкретной итерации чтобы определить производительность машины, затем оцените параметры, основанные на том, сколько времени занял цикл for ... идея? или я совершенно не прав в этом вопросе?
Спасибо
3 ответов:
Вы должны сделать движение функцией времени. Начиная с ответа на C# , перемещая мышь реалистично и используя класс секундомера для измерения прошедшего времени:
public void LinearSmoothMove(Point newPosition, TimeSpan duration) { Point start = GetCursorPosition(); // Find the vector between start and newPosition double deltaX = newPosition.X - start.X; double deltaY = newPosition.Y - start.Y; // start a timer Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); double timeFraction = 0.0; do { timeFraction = (double)stopwatch.Elapsed.Ticks / duration.Ticks; if (timeFraction > 1.0) timeFraction = 1.0; PointF curPoint = new PointF(start.X + timeFraction * deltaX, start.Y + timeFraction * deltaY); SetCursorPosition(Point.Round(curPoint)); Thread.Sleep(20); } while (timeFraction < 1.0); }
Я бы рекомендовал немного физики. Скорость-это расстояние, деленное на время. Если вы хотите согласную скорость мыши на каждой машине, вы должны получить точное время.
Приведем пример:
Вы хотите переместить мышь из точки 0/0 в точку 400/600, и конечная точка всегда должна быть достигнута через 3 секунды.
Поэтому вы должны сохранить время начала и построить цикл while, который закончится в starttime + 3s. в цикле вы вычисляете координаты X и Y из прошедших и общее время.
X = 400 / 3s * ElapsedTime Y = 600 / 3s * ElapsedTimeЭто будет независимая машина. Для хорошего результата вы должны использовать высокое точное время, такое каксекундомер .
Я попробовал этот, но все еще не оптимальный. Он все еще меняется в зависимости от мощности обработки машины.@Justin, используйте другое значение для продолжительности и времени сна. Дайте мне знать, если вы придумаете лучшее решение после того, как протестируете его.Спасибо!
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Diagnostics; using System.Threading; namespace ConsoleApplication11 { class Program { [DllImport("user32.dll")] static extern bool SetCursorPos(int X, int Y); public static void LinearSmoothMove(Point newPosition, TimeSpan duration) { Point start = Cursor.Position; int sleep = 10; //PointF iterPoint = start; // Find the vector between start and newPosition double deltaX = newPosition.X - start.X; double deltaY = newPosition.Y - start.Y; // start a timer Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); double timeFraction = 0.0; do { timeFraction = (double)stopwatch.Elapsed.Ticks / duration.Ticks; if (timeFraction > 1.0) timeFraction = 1.0; PointF curPoint = new PointF((float)(start.X + timeFraction * deltaX), (float)(start.Y + timeFraction * deltaY)); SetCursorPos(Point.Round(curPoint).X, Point.Round(curPoint).Y); Thread.Sleep(sleep); } while (timeFraction < 1.0); } static void Main(string[] args) { TimeSpan delayt = new TimeSpan(0, 0, 3); LinearSmoothMove(new Point(20, 40), delayt); Console.Read(); } } }
Comments