1

Тема: AHK: Изменение чувствительности мыши.

Вот в  этой теме http://forum.script-coding.com/viewtopic.php?id=5768  нужно было заблокировать курсор... У меня есть другая идея, как можно решить мою проблему...
Можно ли через Autohotkey уменьшить чувствительность мыши меньше чем дает стандартные возможности windows? Уменьшить sensitiviti, скажем до 0.00001, если учесть что было 2, и тогда будет казаться, что курсор совсем не двигается. Можно так сделать?
P.S. Я еще раньше видел тут на форуме скрипт на изменение чувствительности мыши скролом. Только он мне тогда не нужен был. Сейчас начал искать его - не нашел. Пол часа искал. Гугл тоже никаких похожих команд не выдал. Еще дайте ссылку на тот скрипт, пожалуйста.

2 (изменено: MasS, 2011-05-04 20:34:38)

Re: AHK: Изменение чувствительности мыши.

Доступ к памяти других процессов.
Адрес сенсы ищется с помощью программы ArtMoney, у неё есть подробное описание на русском языке.

Управление сенсой в CS 1.6:
При нажатии левой клавиши мыши скрипт посылает нажатие, запоминает текущее значение сенсы и меняет его на 0 (на деле скорость не становится равна 0, но весьма значительно замедляется).
При отпускании левой клавиши мыши скрипт возвращает предыдущее значение сенсы.

#noenv
#singleinstance force
#ifwinactive ahk_class Valve001

*$~lbutton::
WinGet, ID, PID, A
WriteAddress = 0x0392364C
ReadAddress = 0x0392364C
Size = 4
Data = 0
PreviousSence := GetVar(ReadAddress,ID,Size) ;запоминаем текущую сенсу
WriteVar(WriteAddress,ID,Size,Data) 
return

*$~lbutton up::
WinGet, ID, PID, A
WriteAddress = 0x0392364C
Size = 4
Data := PreviousSence                    ;возвращаем записанную ранее сенсу
WriteVar(WriteAddress,ID,Size,Data) 
return

;***************функции*************************
WriteVar(WriteAddress,ID,Size,Data) 
{
Address := WriteAddress           ; Адрес, куда писать.
Data := Data                      ; Что писать.
Size := Size                      ; Сколько байт писать.

VarSetCapacity(Buf, Size, 0)      ; Буфер, для записываемых данных.

NumPut(Data, Buf, 0, "UInt")      ; Данные - в буфер.

PROCESS_VM_WRITE = 0x20           ; Права на процесс.
PROCESS_VM_OPERATION = 0x8

PID := ID

hProcess := DllCall("OpenProcess", "UInt", PROCESS_VM_WRITE | PROCESS_VM_OPERATION
                                 , "Int",  False
                                 , "UInt", PID)
If(!hProcess) {
  MsgBox, Не удалось открыть процесс.
  ExitApp
}

Ret := DllCall("WriteProcessMemory", "UInt", hProcess
                                   , "UInt", Address
                                   , "UInt", &Buf
                                   , "UInt", Size
                                   , "UInt", 0)

DllCall("CloseHandle", "UInt", hProcess) ; Освобождение хэндла процесса.

If(!Ret) {
  MsgBox, Не удалось записать.
  ExitApp
}
}

GetVar(ReadAddress,ID,Size) 
{
PID := DllCall("GetCurrentProcessId")
ReadAddress := ReadAddress        ; Адрес, откуда читать.
ReadSize := Size                  ; Сколько байт читать.
VarSetCapacity(Buf, ReadSize, 0)  ; Буфер, куда считывать.    
PROCESS_VM_READ = 0x10            ; Права на процесс.

PID := ID

hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                 , Int, False
                                 , UInt, PID)
If(!hProcess) {
  MsgBox, Не удалось открыть процесс.
  ExitApp
}

Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                  , UInt, ReadAddress
                                  , UInt, &Buf
                                  , UInt, ReadSize
                                  , UInt, 0)

DllCall("CloseHandle", UInt, hProcess) ; Освобождение хэндла процесса.

If(!Ret) {
  MsgBox, Не удалось прочитать.
  ExitApp
}

return NumGet(Buf, 0, "UInt")  ; Считывание из буфера в переменную.

}

P.S. Классная идея, надо сделать замедление курсора на Shift
*для справки в CS есть консоль, вызываемая буквой Ё, все настройки можно задавать через неё, так, чтобы задать сенсу, надо написать sensitivity X, где X - значение сенсы*

3

Re: AHK: Изменение чувствительности мыши.

MasS, твой скрипт у меня не работает.

sergeant.coolagin пишет:

Я еще раньше видел тут на форуме скрипт на изменение чувствительности мыши скролом.

Этот, наверное. Он сейчас в архиве после чистки форума.

;начальная инициализация. Берет текущую (при загрузке скрипта) скорость мышки.
SPI_GETMOUSESPEED = 0x70
SPI_SETMOUSESPEED = 0x71
DllCall("SystemParametersInfo", UInt, SPI_GETMOUSESPEED, UInt, 0, UIntP, MouseSpeed, UInt, 0)
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000

wheelup::
;Ctrl+Numpad8
   MouseSpeed++ ;увеличивает на 1 текущую скорость мышки
   DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, MouseSpeed, UInt, 0) ;задает ее системе
   ToolTip, Mouse speed: %MouseSpeed% pixels ; выдает подсказку у курсора о текущей скорости
   SetTimer, RemoveToolTip, 1000
return

wheeldown::
If MouseSpeed > 1
    MouseSpeed--
else                          ;если скорость минимальна то показать подсказку и выйти
{
    ToolTip, Mouse speed: minimal
    return
}
 DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, MouseSpeed, UInt, 0)
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return

RemoveToolTip:                           ;подпрограмма убирания подсказки
SetTimer, RemoveToolTip, Off
ToolTip
return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Изменение чувствительности мыши.

OFF:

teadrinker пишет:

Этот, наверное. Он сейчас в архиве после чистки форума.

Если есть нужда — подымайте его обратно из архива в Разработку.

5

Re: AHK: Изменение чувствительности мыши.

Предположу только, что дело в различных версиях CS и, соответственно, различных адресах сенсы, у меня работает (только что перепроверил). А вот уменьшение чувствительности скроллом это просто супер!

6 (изменено: MasS, 2011-05-08 13:18:09)

Re: AHK: Изменение чувствительности мыши.

Допиленный скрипт, сейчас опробовал, работает прекрасно!

#noenv
#singleinstance force
#ifwinactive ahk_class Valve001

SPI_GETMOUSESPEED = 0x70
SPI_SETMOUSESPEED = 0x71
DllCall("SystemParametersInfo", UInt, SPI_GETMOUSESPEED, UInt, 0, UIntP, MouseSpeed, UInt, 0)

OldMouseSpeed := MouseSpeed 
SlowCoeff      = 0.1
OnExit, ExitLabel
return

~Lbutton:: 
MouseSpeed := MouseSpeed*SlowCoeff   ;Рассчет замедления.
if MouseSpeed < 1                    ;Эксперименты показали, что значения 
    {                                ;меньше 1 игнорируются.
    MouseSpeed = 1
    }
DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, MouseSpeed, UInt, 0)
StringTrimLeft, Key, A_ThisHotKey, 1   ;Вырезаем тильду из переменной, чтобы 
KeyWait, %Key%                         ;сработала команда KeyWait.
MouseSpeed := OldMouseSpeed            ;При отпускании клавиши возвращаем предыдущее значение скорости.
DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, MouseSpeed, UInt, 0)
return

ExitLabel:
MouseSpeed := OldMouseSpeed
DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, MouseSpeed, UInt, 0)
exitapp

teadrinker, http://img1.liveinternet.ru/images/attach/c/2//67/295/67295670_Blagodaryu.gif