Статья про настройку "Повышенная точность установки указателя" в панели управления Windows, почему она мешает в играх, но может быть удобной для работы с окнами и приложениями, и как программно автоматизировать её переключение с помощью короткого кода на C#.
Для динамичных игр особенно важна точность управления мышью, вернее равномерность и предсказуемость передвижения прицела, чтобы наведение на цель могло быть отработано рефлекторно. Для этого некоторые пользователи отключают настройку "Повышенная точность установки указателя" (Enhance Pointer Precision в англоязычной версии системы), доступную в панели управления Windows.
При этом, отключение настройки приводит к тому, что снижается удобство работы с окнами и приложениями. Либо указатель движется очень быстро и становится труднее попадать в мелкие кнопки, либо, при снижении настройки скорости, увеличивается ход руки и начинает не хватать пространства коврика.
Эту настройку иногда называют ускорением мыши, но, технически, это не ускорение, а нелинейное преобразование смещения сенсора мыши относительно коврика в смещение указателя в экранном пространстве, при этом коэффициент преобразования зависит от скорости. Таким образом, отключение настройки делает преобразование смещения линейным.
Постоянно отключать эту настройку, например для игр, и затем включать обратно - неудобно. И довольно странно, что такой опции не существует в свойствах ярлыка, например на вкладке "совместимость".
Существуют утилиты для автоматизации данного действия, но они более громоздкие, чем мне хотелось, поэтому набросал свой минималистичный и простой вариант решения на C#:
создаем файл EnhancePointerPrecisionSwitch.cs
using System;
using System.Runtime.InteropServices;
namespace EnhancePointerPrecisionSwitch
{
internal static class Program
{
enum SPIF { NONE = 0x00, SPIF_UPDATEINIFILE = 0x01, SPIF_SENDCHANGE = 0x02 }
const UInt32 SPI_GETMOUSE = 0x0003, SPI_SETMOUSE = 0x0004;
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = true)]
static extern bool SystemParametersInfo(uint action, uint param, IntPtr vparam, SPIF fWinIni);
[STAThread]
static void Main(string[] args)
{
int[] mouseParams = new int[3];
GCHandle gch = GCHandle.Alloc(mouseParams, GCHandleType.Pinned);
SystemParametersInfo(SPI_GETMOUSE, 0, gch.AddrOfPinnedObject(), SPIF.NONE);
if (Array.IndexOf(args, "on") >= 0) mouseParams[2] = 1;
if (Array.IndexOf(args, "off") >= 0) mouseParams[2] = 0;
if (Array.IndexOf(args, "toggle") >= 0) mouseParams[2] = mouseParams[2] == 0 ? 1 : 0;
SystemParametersInfo(SPI_SETMOUSE, 0, gch.AddrOfPinnedObject(), (Array.IndexOf(args, "permanent") >= 0) ? SPIF.SPIF_UPDATEINIFILE : SPIF.SPIF_SENDCHANGE);
gch.Free();
}
}
}
этот код можно собрать с помощью csc из предустановленного в системе .NET Framework 4.x через командную строку
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe EnhancePointerPrecisionSwitch.cs
получаем exe файл размером около 5 KB, принимающий аргументы командной строки:
on - включает точность установки указателя
off - выключает
toggle - переключает
permanent - значение остается после перезагрузки (применяется с одним из вышеперечисленных аргументов, функциональность этого параметра может зависеть от версии и настроек ОС)
Пример использования:
создаём bat файл с примерно таким содержимым:
C:\Programs\EnhancePointerPrecisionSwitch\EnhancePointerPrecisionSwitch.exe off
START /WAIT C:\games\Quake3\quake3.exe +connect server:port
C:\Programs\EnhancePointerPrecisionSwitch\EnhancePointerPrecisionSwitch.exe on
И запускаем игру уже через него.
Файлы EnhancePointerPrecisionSwitch.cs и compile.bat можно также взять здесь.