Статья про настройку "Повышенная точность установки указателя" в панели управления 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 можно также взять здесь.

Комментарии (2)


  1. AlmostBatman
    25.07.2024 21:29

    Обычно включением "линейного смещения" пользуются геймеры. А у них мышки с хорошими показателями dpi - получается, что надо не только "повышенную точность" переключать, но и скорость движения курсора менять на удобную.

    Добавляйте в код и действительно можно пользоваться)


    1. questfulcat Автор
      25.07.2024 21:29

      так в этом нет смысла, другая скорость выбирается в настройках игры (например параметр sensitivity в q3), таким образом можно подобрать удобные настройки скорости и в системе и в игре даже без переключения dpi мышки. Тут главное - получить во время игрового процесса чистые данные с сенсора, не искажаемые системой, а там игровыми настройками уже докручивать и скорости и ускорения, при чём в некоторых играх даже индивидуально по каждой оси можно...