Вы должны войти, чтобы создавать сообщения и темы.

Повышенная точность установки указателя -- способ быстрого вкл/выкл

Привет!
Обычно функция "повышенная точность установки указателя" у меня включена, но в некоторых старых играх она плохо влияет на повороты камеры, и её перед запуском игры надо выключать. Постоянно заходить в параметры -- несколько утомляет. Есть ли быстрый способ включать-выключать эту фкункцию? Может, батниками можно?..

Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.

Скорей всего это невозможно, но это не точно =)

Лайкнули Олесь и AwSomeSiz
ОлесьAwSomeSiz
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн
Цитата: Mikhail от 15.02.2023, 16:27

Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.

Скорей всего это невозможно, но это не точно =)

Я тут погуглил, проблема, оказывается, актуальна давненько 🙂
Самый прикол, что в современных играх эта функция, по-видимому, как-то отключается без перезагрузки. По крайней мере, я нигде не замечал таких вот неравномерных движений камеры, какие в старых играх при включённой точности указателя наблюдаются.

Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн
Цитата: Mikhail от 15.02.2023, 17:24

Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.

Лично мне она сильно полезна, например, при работе в Ворде, когда надо точно поставить курсор в нужное место, или в Сибелиусе (аналог Ворда для набора нот, там ещё точнее надо курсором тыкать), но ставить постоянную медленную скорость мыши не хочу -- не люблю, когда, чтобы переместить мышь из угла в угол монитора, требуется делать рукой размах в полстола))

Неделю посидишь без точности(ну смотря как быстро адаптируешься), будешь круги ровные рисовать, у меня dpi 1950 на full hd моник, точность отключена, я тебе хоть куда могу прицелиться, это все привычка, ты просто привык к точности, а теперь привыкни наоборот.

Лайкнули Александр, vb и ещё 2
АлександрvbОлесьAlas Nameless
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн
Цитата: Mikhail от 15.02.2023, 16:27

Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.

Скорей всего это невозможно, но это не точно =)

Привет, это возможно!

Приятель попросил сделать софтину, чтобы в играх отключалась эта фича.

Первое, что пришло на ум - менять значение в реестре, однако применялось это всё дело только после перезагрузки. Решил не сдаваться, так как полный ноль в написании софта под винду, убил 4 часа, но получилось сделать рабочий вариант))
В будущем хочу убрать таймер, так как каждую секунду анализировать окна и менять настройки - смертный грех. Можно будет отслеживать изменение активного окна.

Вот код, надеюсь скомпилить труда не составит (а то хз, можно ли на форуме exeшники прикрелять)):

C#, консольное приложение Microsoft

using System.Diagnostics;
using System.Runtime.InteropServices;

class GameAccuracyService
{

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetConsoleWindow();

    private const int SW_HIDE = 0;

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [DllImport("user32.dll")]
    private static extern int GetSystemMetrics(int nIndex);

    public const int SPI_GETMOUSE = 0x0003;
    public const int SPI_SETMOUSE = 0x0004;
    private const int SPIF_SENDCHANGE = 0x02;

    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = true)]
    public static extern bool SystemParametersInfoGet(uint action, uint param, IntPtr vparam, uint fWinIni);

    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = true)]
    public static extern bool SystemParametersInfoSet(uint action, uint param, IntPtr vparam, uint fWinIni);



    private struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    private static bool IsGameRunning()
    {
        Process[] processes = Process.GetProcesses();

        foreach (Process process in processes)
        {
            if (process.MainWindowHandle != IntPtr.Zero && process.MainWindowHandle == GetForegroundWindow())
            {
                RECT rect;
                if (GetWindowRect(process.MainWindowHandle, out rect))
                {
                    int screenWidth = GetSystemMetrics(0);
                    int screenHeight = GetSystemMetrics(1);
                    int windowWidth = rect.Right - rect.Left;
                    int windowHeight = rect.Bottom - rect.Top;

                    if (windowWidth == screenWidth && windowHeight == screenHeight)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private static void EnableMousePrecision()
    {
        int[] mouseParams = new int[3];
        SystemParametersInfoGet(SPI_GETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), 0);
        mouseParams[2] = 1;
        SystemParametersInfoSet(SPI_SETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), SPIF_SENDCHANGE);

    }

    private static void DisableMousePrecision()
    {
        int[] mouseParams = new int[3];
        SystemParametersInfoGet(SPI_GETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), 0);
        mouseParams[2] = 0;
        SystemParametersInfoSet(SPI_SETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), SPIF_SENDCHANGE);
    }

    static void Main()
    {
        IntPtr handle = GetConsoleWindow();
        ShowWindow(handle, SW_HIDE);

        while (true)
        {
            if (IsGameRunning())
            {
                DisableMousePrecision();
            }
            else
            {
                EnableMousePrecision();
            }

            Thread.Sleep(1000);
        }
    }
}

Компилишь, закидываешь в автозагрузку и кайфуешь.

Лайкнули Arman, Mikhail и ещё 2
ArmanMikhailСибирьAlas Nameless

AwSomeSiz, Привет.
Действительно, это работает, спасибо🤝

Лайкнул AwSomeSiz
AwSomeSiz
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, безумно рад, что это также заработало у тебя!

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

Как появится свободное от работы время - внесу кучу правок в код, чтобы процессорное время впустую не жрало, и распознавало не все полноэкранные приложения (к примеру тот же ютуб в chrome на весь экран), а именно игры (пока хз, как с точностью определить, игра ли является активным окном или иное ПО)

Лайкнул Arman
Arman