Как добавить сглаживание перемещения мыши

Добавляем сглаживание перемещений мыши

Оба фрагмента выполняются в верхнеуровневом C# Script EyeAuras с загруженным модулем ввода. Первый выбирает готовый алгоритм, второй содержит полный класс собственного алгоритма. Нужен доступный симулятор ввода; код перемещает настоящий курсор основного монитора. По умолчанию, мышь "телепортируется" из точки А в точку Б, что не всегда является желаемым поведением. Вот тут-то на помощь и приходят "смузеры" - инструменты, которые умеют строить план перемещения мыши по какой-то логике. Сам алгоритм может отличаться. По умолчанию в программу встроены алгоритмы от BenLand (BenLandUserInputSmoother) и Kalon (KalonUserInputSmoother). В них есть некоторые параметры, которые вы можете настраивать, но даже по умолчанию в программу встроены несколько пресетов, вот самые полезные:

  • BenLandLinearFast - перемещает мышь из точки А в точку Б по прямой
  • BenLandRandomizedFast - перемещает добавляя некоторое отклонение в начальной точке траектории

Указав в коде InputSmootherId можно указать симулятору, что перемещения мыши нужно сглаживать

csharp
var SendInput = GetService<ISendInputScriptingApi>(); // нужно для отправки ввода
SendInput.InputSmootherId = "BenLandRandomizedFast"; // указываем здесь Id смузера

Пример, в котором мы реализуем свое собственное сглаживание

Импортировать готовый пример можно отсюда https://eyeauras.net/share/S20240701201856mfdkUQbqEY1k

  1. Создаем ауру со скриптом
  2. Копипастим, запускаем, если все хорошо - скрипт переместит мышь в центр экрана с видимой задержкой и достаточно плавно
csharp
using EyeAuras.Roxy.Services;
using EyeAuras.Roxy.Shared;
using System.Drawing;
using System.Collections.Generic;

var SendInput = GetService<ISendInputScriptingApi>(); // нужно для отправки ввода

var customSmoother = new CustomInputSmoother();
GetService<IUserInputSmootherRegistrator>() // берем службу, которая отвечает за все наши "смузеры"
    .Register(customSmoother); // и добавляем наш

// а теперь говорим API, чтобы он использовал наш смузер
SendInput.InputSmootherId = customSmoother.Id; // or something like "BenLandRandomizedFast";

SendInput.TargetWindow = null; // координаты основного экрана
var screenSize = System.Windows.Forms.SystemInformation.PrimaryMonitorSize; // берем размер основного экрана

Log.Info($"Primary monitor size: {screenSize}");
SendInput.MouseMoveTo(screenSize.Width / 2, screenSize.Height / 2); // переводим в центр
Log.Info($"Movement completed, cursor is at: {SendInput.CursorPosition}");

/// <summary>
/// В этом классе сосредоточена вся суть нашего смузера.
/// Он добавляет NumberOfPoints точек между начальной точкой перемещения и конечной.
/// "Настоящий" смузер может использовать какие-нибудь штуки типа кривых Безье или любую другую логику 
/// </summary>
class CustomInputSmoother : IUserInputSmoother
{
    public string Id { get; init; } = "MyScript.Linear20";

    public string Name { get; init; } = "This is my new cool input smoother";

    public int NumberOfPoints { get; init; } = 20;

    public TimeSpan DelayBetweenPoints { get; init; } = TimeSpan.FromMilliseconds(10);

    public IReadOnlyList<MouseInput> Generate(
        Point startPosition,
        Point targetPosition)
    {
        var inputs = new List<MouseInput>();

        //спасибо ChatGPT за немного кода для аппроксимации точек на прямой
        for (int i = 0; i <= NumberOfPoints; i++)
        {
            var t = (float)i / NumberOfPoints;

            var x = (int)(startPosition.X * (1 - t) + targetPosition.X * t);
            var y = (int)(startPosition.Y * (1 - t) + targetPosition.Y * t);

            var input = new MouseInput(new Point(x, y), DelayBetweenPoints);
            inputs.Add(input);
        }

        return inputs;

    }
}

Generate строит план из 21 точки, включая начало и конец; задержка каждой точки — 10 мс. Это не обещание точного времени перемещения. Register возвращает void, заменяет запись с тем же Id и не даёт токен удаления: регистрация не снимается автоматически при остановке скрипта. Выберите собственный стабильный идентификатор, чтобы не заменить чужой алгоритм. Вызов ввода синхронный и не принимает токен отмены скрипта.

Дальше

Контекст скрипта · Ввод и сглаживание · SendInput

Контракты сверены со срезом EyeAuras 20fd3d4 и PoeEye 0e02c98. Полные сигнатуры смотрите в SDK/XML своей версии; наличие символа не подтверждает доступность внешнего пакета или нативного компонента. Пример здесь не проверялся компиляцией или запуском.