Скорость мыши в Windows нелинейная. Как преобразовать ее в линейный масштаб? - PullRequest
0 голосов
/ 27 октября 2018

Я пишу приложение для Windows, которое использует SendInput для перемещения мыши без необходимости использования реальной мыши. Одна из его желаемых функций заключается в том, что он будет создавать одно и то же движение вне зависимости от того, как настроена скорость мыши пользователя (при условии, что у них не отмечена опция «Повышение точности указателя», поэтому мое приложение не должно учитывать «ускорение мыши»). «).

Я делаю это, получая настройку скорости мыши в Windows и деля ее на результат. Таким образом, если пользователь удваивает свои настройки скорости мыши, мое приложение уменьшает его вывод вдвое, и они должны отменить (если настройка скорости мыши фактически представляет множитель для скорости курсора).

Я получаю настройку скорости мыши с помощью SystemParametersInfo (SPI_GETMOUSESPEED ...), которая, согласно документации Microsoft , дает скорость в масштабе от 1 до 20.

int result;
if (SystemParametersInfo(SPI_GETMOUSESPEED, 0, &result, 0)) {
    return result;
}

Проблема в том, что это значение не линейно пропорционально фактической скорости мыши с заданным вводом. Если бы это было линейно пропорционально, если данное движение мыши перемещало экранный курсор на расстояние X, удвоение установки скорости мыши и выполнение того же движения мыши должно привести к тому, что экранный курсор переместится на расстояние 2X. При вдвое уменьшении значения на экране должно появиться движение в 0,5 раза.

Но это так не работает.

Даже после того, как мое приложение делит скорость мыши на настройку скорости мыши в Windows, очень низкие настройки скорости мыши дают более медленный, чем ожидалось, вывод.

Существует ли какая-либо документация, показывающая, как сопоставить скорость мыши Windows с фактической скоростью (независимо от единиц измерения), подходящей для отмены этой настройки? Или есть лучший способ для меня учесть настройку скорости мыши пользователя или полностью игнорировать настройки мыши?

Спасибо!

1 Ответ

0 голосов
/ 27 октября 2018

Counter-Strike вики Liquipedia имеет ответ.В этой таблице показано, как метки в настройках скорости мыши в Windows соответствуют различным множителям.Логика заключается в том, что средняя метка равна 1,0 (без изменений), каждый шаг вправо от нее увеличивает множитель на 0,25, а влево уменьшает чувствительность на 1/8, пока не достигнет 1/8.Затем он делится пополам и снова наполовину.

Проще взглянуть на сам стол.Мое приложение просто имеет это в массиве (средняя строка выключена, что означает, что эти числа применимы, когда Enhance Pointer Precision отключена).

Я переписал соответствующую часть таблицы здесь.Левый столбец - это число, полученное с помощью SystemParametersInfo (SPI_GETMOUSESPEED ...), а правый столбец - соответствующий множитель:

1    1/32
2    1/16
3    1/8
4    2/8
5    3/8
6    4/8
7    5/8
8    6/8
9    7/8
10   1.0
11   1.25
12   1.5
13   1.75
14   2.0
15   2.25
16   2.5
17   2.75
18   3.0
19   3.25
20   3.5

Пока что в моем приложении это работает хорошо.

...