Повышенная точность установки указателя мыши в играх

64eb3fff795e54a49588c2356f12b3f8.jpg

Статья про настройку «Повышенная точность установки указателя» в панели управления Windows, почему она мешает в играх, но может быть удобной для работы с окнами и приложениями, и как программно автоматизировать её переключение с помощью короткого кода на C#.

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

c4773721d9508faeeebd0640bff7fbfe.png

При этом, отключение настройки приводит к тому, что снижается удобство работы с окнами и приложениями. Либо указатель движется очень быстро и становится труднее попадать в мелкие кнопки, либо, при снижении настройки скорости, увеличивается ход руки и начинает не хватать пространства коврика.

Эту настройку иногда называют ускорением мыши, но, технически, это не ускорение, а нелинейное преобразование смещения сенсора мыши относительно коврика в смещение указателя в экранном пространстве, при этом коэффициент преобразования зависит от скорости. Таким образом, отключение настройки делает преобразование смещения линейным.

Постоянно отключать эту настройку, например для игр, и затем включать обратно — неудобно. И довольно странно, что такой опции не существует в свойствах ярлыка, например на вкладке «совместимость».

Существуют утилиты для автоматизации данного действия, но они более громоздкие, чем мне хотелось, поэтому набросал свой минималистичный и простой вариант решения на 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 можно также взять здесь.

© Habrahabr.ru