Повышенная точность установки указателя -- способ быстрого вкл/выкл
Цитата: Олесь от 15.02.2023, 14:50Привет!
Обычно функция "повышенная точность установки указателя" у меня включена, но в некоторых старых играх она плохо влияет на повороты камеры, и её перед запуском игры надо выключать. Постоянно заходить в параметры -- несколько утомляет. Есть ли быстрый способ включать-выключать эту фкункцию? Может, батниками можно?..
Привет!
Обычно функция "повышенная точность установки указателя" у меня включена, но в некоторых старых играх она плохо влияет на повороты камеры, и её перед запуском игры надо выключать. Постоянно заходить в параметры -- несколько утомляет. Есть ли быстрый способ включать-выключать эту фкункцию? Может, батниками можно?..
Цитата: Mikhail от 15.02.2023, 16:27Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.Скорей всего это невозможно, но это не точно =)
Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.
Скорей всего это невозможно, но это не точно =)
Цитата: Олесь от 15.02.2023, 17:22Цитата: Mikhail от 15.02.2023, 16:27Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.Скорей всего это невозможно, но это не точно =)
Я тут погуглил, проблема, оказывается, актуальна давненько 🙂
Самый прикол, что в современных играх эта функция, по-видимому, как-то отключается без перезагрузки. По крайней мере, я нигде не замечал таких вот неравномерных движений камеры, какие в старых играх при включённой точности указателя наблюдаются.
Цитата: Mikhail от 15.02.2023, 16:27Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.Скорей всего это невозможно, но это не точно =)
Я тут погуглил, проблема, оказывается, актуальна давненько 🙂
Самый прикол, что в современных играх эта функция, по-видимому, как-то отключается без перезагрузки. По крайней мере, я нигде не замечал таких вот неравномерных движений камеры, какие в старых играх при включённой точности указателя наблюдаются.
Цитата: Mikhail от 15.02.2023, 17:24Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.
Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.
Цитата: Олесь от 15.02.2023, 17:32Цитата: Mikhail от 15.02.2023, 17:24Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.
Лично мне она сильно полезна, например, при работе в Ворде, когда надо точно поставить курсор в нужное место, или в Сибелиусе (аналог Ворда для набора нот, там ещё точнее надо курсором тыкать), но ставить постоянную медленную скорость мыши не хочу -- не люблю, когда, чтобы переместить мышь из угла в угол монитора, требуется делать рукой размах в полстола))
Цитата: Mikhail от 15.02.2023, 17:24Да выключи ее вообще, зачем тебе эта точность?), она мешает не только в играх, но и в макросах например, координаты x/y нереально будет указать с этой опцией.
Лично мне она сильно полезна, например, при работе в Ворде, когда надо точно поставить курсор в нужное место, или в Сибелиусе (аналог Ворда для набора нот, там ещё точнее надо курсором тыкать), но ставить постоянную медленную скорость мыши не хочу -- не люблю, когда, чтобы переместить мышь из угла в угол монитора, требуется делать рукой размах в полстола))
Цитата: Mikhail от 15.02.2023, 17:35Неделю посидишь без точности(ну смотря как быстро адаптируешься), будешь круги ровные рисовать, у меня dpi 1950 на full hd моник, точность отключена, я тебе хоть куда могу прицелиться, это все привычка, ты просто привык к точности, а теперь привыкни наоборот.
Неделю посидишь без точности(ну смотря как быстро адаптируешься), будешь круги ровные рисовать, у меня dpi 1950 на full hd моник, точность отключена, я тебе хоть куда могу прицелиться, это все привычка, ты просто привык к точности, а теперь привыкни наоборот.
Цитата: AwSomeSiz от 24.05.2023, 05:27Цитата: Mikhail от 15.02.2023, 16:27Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.Скорей всего это невозможно, но это не точно =)
Привет, это возможно!
Приятель попросил сделать софтину, чтобы в играх отключалась эта фича.
Первое, что пришло на ум - менять значение в реестре, однако применялось это всё дело только после перезагрузки. Решил не сдаваться, так как полный ноль в написании софта под винду, убил 4 часа, но получилось сделать рабочий вариант))
В будущем хочу убрать таймер, так как каждую секунду анализировать окна и менять настройки - смертный грех. Можно будет отслеживать изменение активного окна.Вот код, надеюсь скомпилить труда не составит (а то хз, можно ли на форуме exeшники прикрелять)):
[spoiler title="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); } } }[/spoiler]
Компилишь, закидываешь в автозагрузку и кайфуешь.
Цитата: Mikhail от 15.02.2023, 16:27Привет.
Я попытался в общем =), но не вышло ничего и через cmd и через WinAPI на C# (SystemParametersInfo), настройки применяются только после перезагрузки это на cmd на C# вообще ничего¯\_(ツ)_/¯, а система делает это находу, как, я не понял или не додумался...хотя сторонняя утилита, попробовал(Mouse Emulator), он то же самое делает что и я, и тоже не работают.Скорей всего это невозможно, но это не точно =)
Привет, это возможно!
Приятель попросил сделать софтину, чтобы в играх отключалась эта фича.
Первое, что пришло на ум - менять значение в реестре, однако применялось это всё дело только после перезагрузки. Решил не сдаваться, так как полный ноль в написании софта под винду, убил 4 часа, но получилось сделать рабочий вариант))
В будущем хочу убрать таймер, так как каждую секунду анализировать окна и менять настройки - смертный грех. Можно будет отслеживать изменение активного окна.
Вот код, надеюсь скомпилить труда не составит (а то хз, можно ли на форуме exeшники прикрелять)):
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);
}
}
}
Компилишь, закидываешь в автозагрузку и кайфуешь.
Цитата: Mikhail от 24.05.2023, 06:04AwSomeSiz, Привет.
Действительно, это работает, спасибо🤝
AwSomeSiz, Привет.
Действительно, это работает, спасибо🤝
Цитата: AwSomeSiz от 25.05.2023, 01:16Mikhail, безумно рад, что это также заработало у тебя!
Касаемо повышенной точности указателя - очень полезная штука, спасает особенно при использовании дешёвых мышек, ибо минимизирует дрожание курсора из - за хренового сенсора. Только вчера понял, для чего эта фича нужна. Так что настоятельно рекомендую юзать)
Как появится свободное от работы время - внесу кучу правок в код, чтобы процессорное время впустую не жрало, и распознавало не все полноэкранные приложения (к примеру тот же ютуб в chrome на весь экран), а именно игры (пока хз, как с точностью определить, игра ли является активным окном или иное ПО)
Mikhail, безумно рад, что это также заработало у тебя!
Касаемо повышенной точности указателя - очень полезная штука, спасает особенно при использовании дешёвых мышек, ибо минимизирует дрожание курсора из - за хренового сенсора. Только вчера понял, для чего эта фича нужна. Так что настоятельно рекомендую юзать)
Как появится свободное от работы время - внесу кучу правок в код, чтобы процессорное время впустую не жрало, и распознавало не все полноэкранные приложения (к примеру тот же ютуб в chrome на весь экран), а именно игры (пока хз, как с точностью определить, игра ли является активным окном или иное ПО)