- Keys for mouse wheel and left, middle, right, X1 and X2 mouse buttons. (X1 and X2 only supportable on Win2000+.)
- Very smooth movements.
- Much faster speed and acceleration.
- Customizable normal, acceleration and maximum speeds for both mouse movements and wheel.
- Adjustable rotation. With this you can even make this mouse to be inversed like on some flight simulators.
- Uses ScrollLock for activation. This enables you to use the normal NumPad when you don't want the script activated.
- Button/wheel keys are usable even with mouse devices that don't have the wheel or middle, X1 or X2 buttons. (This depends if your mouse hardware support the wheel or those buttons.)
Newest version for AHK2 (2.0-a011-177f85e) is found in my last post in this thread. It's the same as the code for AHK1, but only supported on AHK2 alpha.
Newest version (as found at the end of the thread - tested on AHK 1.1.00.00):
;; Using Keyboard NumPad as a Mouse -- by deguix ; http://www.autohotkey.com ; This script makes mousing with your keyboard almost as easy ; as using a real mouse (maybe even easier for some tasks). ; It supports up to five mouse buttons and the turning of the ; mouse wheel. It also features customizable movement speed, ; acceleration, and "axis inversion". /* o------------------------------------------------------------o |Using Keyboard NumPad as a Mouse | (------------------------------------------------------------) | By deguix / A Script file for AutoHotkey 1.0.48+ | | ----------------------------------------| | | | This script is an example of use of AutoHotkey. It uses | | the remapping of NumPad keys of a keyboard to transform it | | into a mouse. Some features are the acceleration which | | enables you to increase the mouse movement when holding | | a key for a long time, and the rotation which makes the | | NumPad mouse to "turn". I.e. NumPadDown as NumPadUp | | and vice-versa. See the list of keys used below: | |------------------------------------------------------------| | Keys | Description | |------------------------------------------------------------| | ScrollLock (toggle on)| Activates NumPad mouse mode. | |-----------------------|------------------------------------| | NumPad0 | Left mouse button click. | | NumPad5 | Middle mouse button click. | | NumPadDot | Right mouse button click. | | NumPadDiv/NumPadMult | X1/X2 mouse button click. (Win 2k+)| | NumPadSub/NumPadAdd | Moves up/down the mouse wheel. | | NumPadEnter | Mouse movement speed modifier key. | |-----------------------|------------------------------------| | NumLock (toggled off) | Activates mouse movement mode. | |-----------------------|------------------------------------| | NumPadEnd/Down/PgDn/ | Mouse movement. | | /Left/Right/Home/Up/ | | | /PgUp | | | NumPadEnter | Mouse movement speed modifier key. | |-----------------------|------------------------------------| | NumLock (toggled on) | Activates mousewheel movement mode | |-----------------------|------------------------------------| | NumPad1-9 (except 5) | Mouse wheel movement.* | | NumPadEnter | Mouse wheel mov. speed mod. key.** | |------------------------------------------------------------| | NumPadEnter (pressed) | Activates mouse speed adj. mode. | |-----------------------|------------------------------------| | NumPadHome/NumPadEnd/ | +/- acceleration (pixels/cycles). | | NumPad7/NumPad1 | | | NumPadUp/NumPadDown | +/- initial speed (pixels). | | NumPad8/NumPad2 | | | NumPadPgUp/NumPadPgDn | +/- maximum speed (pixels). | | NumPad9/NumPad3 | | | NumPadLeft/NumPadRight| +/- clockwise rotation (45° degree)| | NumPad4/NumPad6 | | |------------------------------------------------------------| | * = Left/Right movements are only supported in Vista+. | | ** = These options are affected by the mouse wheel speed | | adjusted on Control Panel as well. If you don't have a | | mouse with wheel, the default is 3 +/- lines per option | | button press. | o------------------------------------------------------------o */ ;START OF CONFIG SECTION #SingleInstance force #MaxHotkeysPerInterval 500 ; Using the keyboard hook to implement the NumPad hotkeys prevents ; them from interfering with the generation of ANSI characters such ; as à . This is because AutoHotkey generates such characters ; by holding down ALT and sending a series of NumPad keystrokes. ; Hook hotkeys are smart enough to ignore such keystrokes. #UseHook MouseSpeed:=5 MouseAccelerationSpeed:=5 ;in pixels/MouseAccelerationCycles MouseAccelerationCycles:=50 ;interval of timer executions to increase speed by the variable above MouseAccelerationTimerInterval:=10 ;in milliseconds (this ends up to being approximate depending on computer performance) MouseMaxSpeed:=10 MouseRotationAngle:=0 ;Mouse wheel speed is also set on Control Panel. As that ;will affect the normal mouse behavior, the real speed of ;these three below are times the normal mouse wheel speed. MouseWheelSpeed:=2 MouseWheelAccelerationSpeed:=1 ;in pixels/MouseAccelerationCycles MouseWheelAccelerationCycles:=50 ;interval of timer executions to increase speed by the variable above MouseWheelAccelerationTimerInterval:=35 ;in milliseconds (this ends up to being approximate depending on computer performance) MouseWheelMaxSpeed:=5 MouseWheelRotationAngle:=0 MouseButtonPressCheckTimerInterval:=10 ;0=Pressing a button and releasing = down + up events. 1=First time pressing/releasing = down, second time = up. MouseButtonClickLockDownState:=0 MouseButtonMovementLockDownState:=0 ;END OF CONFIG SECTION PI:= 4*ATan(1) ;This is needed or key presses would faulty send their natural ;actions. Like NumPadDiv would send sometimes "/" to the ;screen. #InstallKeybdHook Temp = 0 Temp2 = 0 MouseRotationAnglePart = %MouseRotationAngle% ;Divide by 45° because MouseMove only supports whole numbers, ;and changing the mouse rotation to a number lesser than 45° ;could make strange movements. ; ;For example: 22.5° when pressing NumPadUp: ; First it would move upwards until the speed ; to the side reaches 1. MouseRotationAnglePart /= 45 MouseWheelRotationAnglePart = %MouseRotationAngle% MouseWheelRotationAnglePart /= 45 MovementVectorMagnitude:=0 MovementVectorDirection:=0 MovementVectors:=0 MovementVectorDefaultMagnitude:=MouseSpeed MovementWheelVectorMagnitude:=0 MovementWheelVectorDirection:=0 MovementWheelVectors:=0 MovementWheelVectorDefaultMagnitude:=MouseWheelSpeed Buttons:=0 SetKeyDelay, -1 SetMouseDelay, -1 Hotkey, *NumPad0, ButtonLeftClick Hotkey, *NumPadIns, ButtonLeftClickIns Hotkey, *NumPad5, ButtonMiddleClick Hotkey, *NumPadClear, ButtonMiddleClickClear Hotkey, *NumPadDot, ButtonRightClick Hotkey, *NumPadDel, ButtonRightClickDel Hotkey, *NumPadDiv, ButtonX1Click Hotkey, *NumPadMult, ButtonX2Click Hotkey, *NumPadSub, ButtonWheelUp Hotkey, *NumPadAdd, ButtonWheelDown Hotkey, *NumPadRight, ButtonRight Hotkey, *NumPadPgUp, ButtonUpRight Hotkey, *NumPadUp, ButtonUp Hotkey, *NumPadHome, ButtonUpLeft Hotkey, *NumPadLeft, ButtonLeft Hotkey, *NumPadEnd, ButtonDownLeft Hotkey, *NumPadDown, ButtonDown Hotkey, *NumPadPgDn, ButtonDownRight Hotkey, *NumPad6, ButtonWheelRight Hotkey, *NumPad9, ButtonWheelUpRight Hotkey, *NumPad8, ButtonWheelUp Hotkey, *NumPad7, ButtonWheelUpLeft Hotkey, *NumPad4, ButtonWheelLeft Hotkey, *NumPad1, ButtonWheelDownLeft Hotkey, *NumPad2, ButtonWheelDown Hotkey, *NumPad3, ButtonWheelDownRight Hotkey, NumPadEnter & NumPadUp, ButtonSpeedUp Hotkey, NumPadEnter & NumPadDown, ButtonSpeedDown Hotkey, NumPadEnter & NumPadHome, ButtonAccelerationSpeedUp Hotkey, NumPadEnter & NumPadEnd, ButtonAccelerationSpeedDown Hotkey, NumPadEnter & NumPadPgUp, ButtonMaxSpeedUp Hotkey, NumPadEnter & NumPadPgDn, ButtonMaxSpeedDown Hotkey, NumPadEnter & NumPadLeft, ButtonRotationAngleUp Hotkey, NumPadEnter & NumPadRight, ButtonRotationAngleDown Hotkey, NumPadEnter & NumPad8, ButtonWheelSpeedUp Hotkey, NumPadEnter & NumPad2, ButtonWheelSpeedDown Hotkey, NumPadEnter & NumPad7, ButtonWheelAccelerationSpeedUp Hotkey, NumPadEnter & NumPad1, ButtonWheelAccelerationSpeedDown Hotkey, NumPadEnter & NumPad9, ButtonWheelMaxSpeedUp Hotkey, NumPadEnter & NumPad3, ButtonWheelMaxSpeedDown Hotkey, NumPadEnter & NumPad4, ButtonWheelRotationAngleUp Hotkey, NumPadEnter & NumPad6, ButtonWheelRotationAngleDown Hotkey, NumPadEnter, ButtonEnter Gosub, ~ScrollLock ; Initialize based on current ScrollLock state. return ;Key activation support ~ScrollLock:: ; Wait for it to be released because otherwise the hook state gets reset ; while the key is down, which causes the up-event to get suppressed, ; which in turn prevents toggling of the ScrollLock state/light: KeyWait, ScrollLock GetKeyState, ScrollLockState, ScrollLock, T If ScrollLockState = D { Hotkey, *NumPad0, on Hotkey, *NumPadIns, on Hotkey, *NumPad5, on Hotkey, *NumPadDot, on Hotkey, *NumPadDel, on Hotkey, *NumPadDiv, on Hotkey, *NumPadMult, on Hotkey, *NumPadSub, on Hotkey, *NumPadAdd, on Hotkey, *NumPadUp, on Hotkey, *NumPadDown, on Hotkey, *NumPadLeft, on Hotkey, *NumPadRight, on Hotkey, *NumPadHome, on Hotkey, *NumPadEnd, on Hotkey, *NumPadPgUp, on Hotkey, *NumPadPgDn, on Hotkey, *NumPad6, on Hotkey, *NumPad9, on Hotkey, *NumPad8, on Hotkey, *NumPad7, on Hotkey, *NumPad4, on Hotkey, *NumPad1, on Hotkey, *NumPad2, on Hotkey, *NumPad3, on Hotkey, NumPadEnter & NumPadUp, on Hotkey, NumPadEnter & NumPadDown, on Hotkey, NumPadEnter & NumPadHome, on Hotkey, NumPadEnter & NumPadEnd, on Hotkey, NumPadEnter & NumPadPgUp, on Hotkey, NumPadEnter & NumPadPgDn, on Hotkey, NumPadEnter & NumPadLeft, on Hotkey, NumPadEnter & NumPadRight, on Hotkey, NumPadEnter & NumPad8, on Hotkey, NumPadEnter & NumPad2, on Hotkey, NumPadEnter & NumPad7, on Hotkey, NumPadEnter & NumPad1, on Hotkey, NumPadEnter & NumPad9, on Hotkey, NumPadEnter & NumPad3, on Hotkey, NumPadEnter, on } else { Hotkey, *NumPad0, off Hotkey, *NumPadIns, off Hotkey, *NumPad5, off Hotkey, *NumPadDot, off Hotkey, *NumPadDel, off Hotkey, *NumPadDiv, off Hotkey, *NumPadMult, off Hotkey, *NumPadSub, off Hotkey, *NumPadAdd, off Hotkey, *NumPadUp, off Hotkey, *NumPadDown, off Hotkey, *NumPadLeft, off Hotkey, *NumPadRight, off Hotkey, *NumPadHome, off Hotkey, *NumPadEnd, off Hotkey, *NumPadPgUp, off Hotkey, *NumPadPgDn, off Hotkey, *NumPad6, off Hotkey, *NumPad9, off Hotkey, *NumPad8, off Hotkey, *NumPad7, off Hotkey, *NumPad4, off Hotkey, *NumPad1, off Hotkey, *NumPad2, off Hotkey, *NumPad3, off Hotkey, NumPadEnter & NumPadUp, off Hotkey, NumPadEnter & NumPadDown, off Hotkey, NumPadEnter & NumPadHome, off Hotkey, NumPadEnter & NumPadEnd, off Hotkey, NumPadEnter & NumPadPgUp, off Hotkey, NumPadEnter & NumPadPgDn, off Hotkey, NumPadEnter & NumPadLeft, off Hotkey, NumPadEnter & NumPadRight, off Hotkey, NumPadEnter & NumPad8, off Hotkey, NumPadEnter & NumPad2, off Hotkey, NumPadEnter & NumPad7, off Hotkey, NumPadEnter & NumPad1, off Hotkey, NumPadEnter & NumPad9, off Hotkey, NumPadEnter & NumPad3, off Hotkey, NumPadEnter, off } return ButtonEnter: Send, {NumPadEnter} Return ;Mouse click support ButtonLeftClick: ButtonLeftClickIns: ButtonClickType:="Left" MouseButtonName:="LButton" Goto ButtonClickStart ButtonMiddleClick: ButtonMiddleClickClear: ButtonClickType:="Middle" MouseButtonName:="MButton" Goto ButtonClickStart ButtonRightClick: ButtonRightClickDel: ButtonClickType:="Right" MouseButtonName:="RButton" Goto ButtonClickStart ButtonX1Click: ButtonClickType:="X1" MouseButtonName:="XButton1" Goto ButtonClickStart ButtonX2Click: ButtonClickType:="X2" MouseButtonName:="XButton2" ButtonClickStart: StringReplace, ButtonName, A_ThisHotkey, * If (ButtonDown_%ButtonName%!=1) { ButtonDown_%ButtonName%:=1 Buttons:=Buttons+1 Button%Buttons%Name:=ButtonName Button%Buttons%ClickType:=ButtonClickType Button%Buttons%MouseButtonName:=MouseButtonName Button%Buttons%Initialized:=0 Button%Buttons%UnHoldStep:=0 If (Buttons = 1) SetTimer, MouseButtonPressCheck, % MouseButtonPressCheckTimerInterval } Return MouseButtonPressCheck: If (Buttons=0) { SetTimer, MouseButtonPressCheck, off Return } Button:=0 Loop { Button:=Button+1 If (Button%Buttons%Initialized=0) { GetKeyState, MouseButtonState, % Button%Button%MouseButtonName If (MouseButtonState="D") Continue MouseClick, % Button%Button%ClickType,,, 1, 0, D Button%Buttons%Initialized:=1 } GetKeyState, ButtonState, % Button%Button%Name, P If (ButtonState="U" and (MouseButtonClickLockDownState=0 or (MouseButtonClickLockDownState=1 and Button%Buttons%UnHoldStep=2))) { ButtonName:=Button%Buttons%Name ButtonDown_%ButtonName%:=0 MouseClick, % Button%Button%ClickType,,, 1, 0, U ButtonTemp:=Button ButtonTempPrev:=ButtonTemp-1 Loop { ButtonTemp:=ButtonTemp+1 ButtonTempPrev:=ButtonTempPrev+1 If (Buttons<ButtonTemp) { Button%ButtonTempPrev%Name:="" Button%ButtonTempPrev%ClickType:="" Button%ButtonTempPrev%MouseButtonName:="" Button%ButtonTempPrev%Initialized:=0 Break } Button%ButtonTempPrev%Name:=Button%ButtonTemp%Name Button%ButtonTempPrev%ClickType:=Button%ButtonTemp%ClickType Button%ButtonTempPrev%MouseButtonName:=Button%ButtonTemp%MouseButtonName Button%ButtonTempPrev%Initialized:=Button%ButtonTemp%Initialized } Buttons:=Buttons-1 } If(ButtonState="U" and MouseButtonClickLockDownState=1 and Button%Buttons%UnHoldStep=0) Button%Buttons%UnHoldStep:=1 If(ButtonState="D" and MouseButtonClickLockDownState=1 and Button%Buttons%UnHoldStep=1) Button%Buttons%UnHoldStep:=2 If (Buttons<=Button) Break } Return ;Mouse movement support ButtonDownRight: MovementVectorDirectionTemp+=1 ButtonDown: MovementVectorDirectionTemp+=1 ButtonDownLeft: MovementVectorDirectionTemp+=1 ButtonLeft: MovementVectorDirectionTemp+=1 ButtonUpLeft: MovementVectorDirectionTemp+=1 ButtonUp: MovementVectorDirectionTemp+=1 ButtonUpRight: MovementVectorDirectionTemp+=1 ButtonRight: StringReplace, MovementButtonName, A_ThisHotkey, * If (MovementButtonDown_%MovementButtonName%!=1) { MovementButtonDown_%MovementButtonName%:=1 MovementVectors:=MovementVectors+1 MovementVector%MovementVectors%Name:=MovementButtonName MovementVector%MovementVectors%Direction:=(MovementVectorDirectionTemp*PI/4)+(MouseRotationAngle*PI/180) MovementVector%MovementVectors%Magnitude:=MouseSpeed MovementVector%MovementVectors%Initialized:=0 MovementVector%MovementVectors%UnHoldStep:=0 If (MovementVectors = 1) { MouseCurrentAccelerationSpeed:=MouseSpeed SetTimer, MovementVectorAcceleration, % MouseAccelerationTimerInterval } } MovementVectorDirectionTemp:=0 Return MovementVectorAddition: ;Add 2 vectors MovementVectorX:=MovementVectorMagnitude*Cos(MovementVectorDirection)+MovementVector%MovementVector%Magnitude*Cos(MovementVector%MovementVector%Direction) MovementVectorY:=MovementVectorMagnitude*Sin(MovementVectorDirection)+MovementVector%MovementVector%Magnitude*Sin(MovementVector%MovementVector%Direction) MovementVectorMagnitude:=Sqrt(MovementVectorX**2+MovementVectorY**2) MovementVectorDirection:=ATan(MovementVectorY/MovementVectorX) If (MovementVectorX<0) { If (MovementVectorY>0) MovementVectorDirection:=MovementVectorDirection-PI Else MovementVectorDirection:=PI+MovementVectorDirection } MovementVectorMagnitudeRatio:=MovementVectorMagnitude/MouseSpeed Return MovementVectorAcceleration: If (MovementVectors=0) { MovementVectorX:=0.000000 MovementVectorY:=0.000000 MovementVectorMagnitude:=0.000000 MovementVectorDirection:=0.000000 MovementVectorMagnitudeRatio:=0.000000 MovementResultantVectorMagnitude:=0.000000 MovementResultantVectorDirection:=0.000000 MovementResultantVectorX:=0.000000 MovementResultantVectorY:=0.000000 ;TrayTip,,% "(" . MovementResultantVectorMagnitude . "," . MovementResultantVectorDirection . ") - <" . MovementResultantVectorX . "," . MovementResultantVectorY . ">" SetTimer, MovementVectorAcceleration, off Return } MovementVector:=0 Loop { MovementVector:=MovementVector+1 If (MovementVector%MovementVector%Initialized=0) { Gosub, MovementVectorAddition MovementVector%MovementVector%Initialized:=1 } GetKeyState, MovementButtonState, % MovementVector%MovementVector%Name, P If (MovementButtonState="U" and (MouseButtonMovementLockDownState=0 or (MouseButtonMovementLockDownState=1 and MovementVector%MovementVector%UnHoldStep=2))) { MovementButtonName:=MovementVector%MovementVector%Name MovementButtonDown_%MovementButtonName%:=0 MovementVector%MovementVector%Magnitude:=-MovementVector%MovementVector%Magnitude Gosub, MovementVectorAddition MovementVectorTemp:=MovementVector MovementVectorTempPrev:=MovementVector-1 Loop { MovementVectorTemp:=MovementVectorTemp+1 MovementVectorTempPrev:=MovementVectorTempPrev+1 If (MovementVectors<MovementVectorTemp) { MovementVector%MovementVectorTempPrev%Name:="" MovementVector%MovementVectorTempPrev%Direction:=0 MovementVector%MovementVectorTempPrev%Magnitude:=0 MovementVector%MovementVectorTempPrev%Initialized:=0 MovementVector%MovementVectorTempPrev%UnHoldStep:=0 Break } MovementVector%MovementVectorTempPrev%Name:=MovementVector%MovementVectorTemp%Name MovementVector%MovementVectorTempPrev%Direction:=MovementVector%MovementVectorTemp%Direction MovementVector%MovementVectorTempPrev%Magnitude:=MovementVector%MovementVectorTemp%Magnitude MovementVector%MovementVectorTempPrev%Initialized:=MovementVector%MovementVectorTemp%Initialized MovementVector%MovementVectorTempPrev%UnHoldStep:=MovementVector%MovementVectorTemp%UnHoldStep } MovementVectors:=MovementVectors-1 } If(MovementButtonState="U" and MouseButtonMovementLockDownState=1 and MovementVector%MovementVector%UnHoldStep=0) MovementVector%MovementVector%UnHoldStep:=1 If(MovementButtonState="D" and MouseButtonMovementLockDownState=1 and MovementVector%MovementVector%UnHoldStep=1) MovementVector%MovementVector%UnHoldStep:=2 If (MovementVectors<=MovementVector) Break } If (MouseCurrentAccelerationSpeed<MouseMaxSpeed) MouseCurrentAccelerationSpeed:=MouseCurrentAccelerationSpeed+(MouseAccelerationSpeed/MouseAccelerationCycles) MovementResultantVectorMagnitude:=MouseCurrentAccelerationSpeed*MovementVectorMagnitudeRatio MovementResultantVectorDirection:=MovementVectorDirection MovementResultantVectorX:=MovementResultantVectorMagnitude*Cos(MovementResultantVectorDirection) MovementResultantVectorY:=MovementResultantVectorMagnitude*Sin(MovementResultantVectorDirection) ;TrayTip,,% "(" . MovementResultantVectorMagnitude . "," . MovementResultantVectorDirection . ") - <" . MovementResultantVectorX . "," . MovementResultantVectorY . ">" MouseMove, % MovementResultantVectorX, % -MovementResultantVectorY, 0, R Return ;Mouse wheel movement support ButtonWheelDownRight: MovementWheelVectorDirectionTemp+=1 ButtonWheelDown: MovementWheelVectorDirectionTemp+=1 ButtonWheelDownLeft: MovementWheelVectorDirectionTemp+=1 ButtonWheelLeft: MovementWheelVectorDirectionTemp+=1 ButtonWheelUpLeft: MovementWheelVectorDirectionTemp+=1 ButtonWheelUp: MovementWheelVectorDirectionTemp+=1 ButtonWheelUpRight: MovementWheelVectorDirectionTemp+=1 ButtonWheelRight: StringReplace, MovementWheelButtonName, A_ThisHotkey, * If (MovementWheelButtonDown_%MovementWheelButtonName%!=1) { MovementWheelButtonDown_%MovementWheelButtonName%:=1 MovementWheelVectors:=MovementWheelVectors+1 MovementWheelVector%MovementWheelVectors%Name:=MovementWheelButtonName MovementWheelVector%MovementWheelVectors%Direction:=(MovementWheelVectorDirectionTemp*PI/4)+(MouseWheelRotationAngle*PI/180) MovementWheelVector%MovementWheelVectors%Magnitude:=MouseWheelSpeed MovementWheelVector%MovementWheelVectors%Initialized:=0 MovementWheelVector%MovementWheelVectors%UnHoldStep:=0 If (MovementWheelVectors = 1) { MouseWheelCurrentAccelerationSpeed:=MouseWheelSpeed SetTimer, MovementWheelVectorAcceleration, % MouseWheelAccelerationTimerInterval } } MovementWheelVectorDirectionTemp:=0 Return MovementWheelVectorAddition: ;Add 2 vectors MovementWheelVectorX:=MovementWheelVectorMagnitude*Cos(MovementWheelVectorDirection)+MovementWheelVector%MovementWheelVector%Magnitude*Cos(MovementWheelVector%MovementWheelVector%Direction) MovementWheelVectorY:=MovementWheelVectorMagnitude*Sin(MovementWheelVectorDirection)+MovementWheelVector%MovementWheelVector%Magnitude*Sin(MovementWheelVector%MovementWheelVector%Direction) MovementWheelVectorMagnitude:=Sqrt(MovementWheelVectorX**2+MovementWheelVectorY**2) MovementWheelVectorDirection:=ATan(MovementWheelVectorY/MovementWheelVectorX) If (MovementWheelVectorX<0) { If (MovementWheelVectorY>0) MovementWheelVectorDirection:=MovementWheelVectorDirection-PI Else MovementWheelVectorDirection:=PI+MovementWheelVectorDirection } MovementWheelVectorMagnitudeRatio:=MovementWheelVectorMagnitude/MouseWheelSpeed Return MovementWheelVectorAcceleration: If (MovementWheelVectors=0) { MovementWheelVectorX:=0.000000 MovementWheelVectorY:=0.000000 MovementWheelVectorMagnitude:=0.000000 MovementWheelVectorDirection:=0.000000 MovementWheelVectorMagnitudeRatio:=0.000000 MovementWheelResultantVectorMagnitude:=0.000000 MovementWheelResultantVectorDirection:=0.000000 MovementWheelResultantVectorX:=0.000000 MovementWheelResultantVectorY:=0.000000 ;TrayTip,,% "(" . MovementResultantVectorMagnitude . "," . MovementResultantVectorDirection . ") - <" . MovementResultantVectorX . "," . MovementResultantVectorY . ">" SetTimer, MovementWheelVectorAcceleration, off Return } MovementWheelVector:=0 Loop { MovementWheelVector:=MovementWheelVector+1 If (MovementWheelVector%MovementWheelVector%Initialized=0) { Gosub, MovementWheelVectorAddition MovementWheelVector%MovementWheelVector%Initialized:=1 } GetKeyState, MovementWheelButtonState, % MovementWheelVector%MovementWheelVector%Name, P If (MovementWheelButtonState="U" and (MouseButtonMovementLockDownState=0 or (MouseButtonMovementLockDownState=1 and MovementWheelVector%MovementWheelVector%UnHoldStep=2))) { MovementWheelButtonName:=MovementWheelVector%MovementWheelVector%Name MovementWheelButtonDown_%MovementWheelButtonName%:=0 MovementWheelVector%MovementWheelVector%Magnitude:=-MovementWheelVector%MovementWheelVector%Magnitude Gosub, MovementWheelVectorAddition MovementWheelVectorTemp:=MovementWheelVector MovementWheelVectorTempPrev:=MovementWheelVector-1 Loop { MovementWheelVectorTemp:=MovementWheelVectorTemp+1 MovementWheelVectorTempPrev:=MovementWheelVectorTempPrev+1 If (MovementWheelVectors<MovementWheelVectorTemp) { MovementWheelVector%MovementWheelVectorTempPrev%Name:="" MovementWheelVector%MovementWheelVectorTempPrev%Direction:=0 MovementWheelVector%MovementWheelVectorTempPrev%Magnitude:=0 MovementWheelVector%MovementWheelVectorTempPrev%Initialized:=0 MovementWheelVector%MovementWheelVectorTempPrev%UnHoldStep:=0 Break } MovementWheelVector%MovementWheelVectorTempPrev%Name:=MovementWheelVector%MovementWheelVectorTemp%Name MovementWheelVector%MovementWheelVectorTempPrev%Direction:=MovementWheelVector%MovementWheelVectorTemp%Direction MovementWheelVector%MovementWheelVectorTempPrev%Magnitude:=MovementWheelVector%MovementWheelVectorTemp%Magnitude MovementWheelVector%MovementWheelVectorTempPrev%Initialized:=MovementWheelVector%MovementWheelVectorTemp%Initialized MovementWheelVector%MovementWheelVectorTempPrev%UnHoldStep:=MovementWheelVector%MovementWheelVectorTemp%UnHoldStep } MovementWheelVectors:=MovementWheelVectors-1 } If(MovementWheelButtonState="U" and MouseButtonMovementLockDownState=1 and MovementWheelVector%MovementWheelVector%UnHoldStep=0) MovementWheelVector%MovementWheelVector%UnHoldStep:=1 If(MovementWheelButtonState="D" and MouseButtonMovementLockDownState=1 and MovementWheelVector%MovementWheelVector%UnHoldStep=1) MovementWheelVector%MovementWheelVector%UnHoldStep:=2 If (MovementWheelVectors<=MovementWheelVector) Break } If (MouseWheelCurrentAccelerationSpeed<MouseWheelMaxSpeed) MouseWheelCurrentAccelerationSpeed:=MouseWheelCurrentAccelerationSpeed+(MouseWheelAccelerationSpeed/MouseWheelAccelerationCycles) MovementWheelResultantVectorMagnitude:=MouseWheelCurrentAccelerationSpeed*MovementWheelVectorMagnitudeRatio MovementWheelResultantVectorDirection:=MovementWheelVectorDirection MovementWheelResultantVectorX:=MovementWheelResultantVectorMagnitude*Cos(MovementWheelResultantVectorDirection) MovementWheelResultantVectorY:=MovementWheelResultantVectorMagnitude*Sin(MovementWheelResultantVectorDirection) ;TrayTip,,% "(" . MovementResultantVectorMagnitude . "," . MovementResultantVectorDirection . ") - <" . MovementResultantVectorX . "," . MovementResultantVectorY . ">" If (MovementWheelResultantVectorX>=0) MouseClick, wheelright,,, % MovementWheelResultantVectorX, 0, D Else MouseClick, wheelleft,,, % -MovementWheelResultantVectorX, 0, D If (MovementWheelResultantVectorY>=0) MouseClick, wheelup,,, % MovementWheelResultantVectorY, 0, D Else MouseClick, wheeldown,,, % -MovementWheelResultantVectorY, 0, D Return ;Speed/rotation configuration support ;Movement ButtonSpeedUp: MouseSpeed:=MouseSpeed+2 ButtonSpeedDown: MouseSpeed-- If (MouseSpeed>MouseMaxSpeed) MouseSpeed:=MouseMaxSpeed If (MouseSpeed<=1) { MouseSpeed:=1 ToolTip, Mouse speed: %MouseSpeed% pixel } Else ToolTip, Mouse speed: %MouseSpeed% pixels SetTimer, RemoveToolTip, 1000 Return ButtonAccelerationSpeedUp: MouseAccelerationSpeed:=MouseAccelerationSpeed+2 ButtonAccelerationSpeedDown: MouseAccelerationSpeed-- If (MouseAccelerationSpeed<=1) { MouseAccelerationSpeed:=1 ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixel/cycle } Else ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels/cycle SetTimer, RemoveToolTip, 1000 Return ButtonMaxSpeedUp: MouseMaxSpeed:=MouseMaxSpeed+2 ButtonMaxSpeedDown: MouseMaxSpeed-- If (MouseSpeed>MouseMaxSpeed) MouseSpeed:=MouseMaxSpeed If (MouseMaxSpeed<=1) { MouseMaxSpeed:=1 ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixel } Else ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels SetTimer, RemoveToolTip, 1000 Return ButtonRotationAngleUp: MouseRotationAnglePart:=MouseRotationAnglePart+2 ButtonRotationAngleDown: MouseRotationAnglePart-- If(MouseRotationAnglePart>=8) MouseRotationAnglePart:=0 If(MouseRotationAnglePart<0) MouseRotationAnglePart:=7 MouseRotationAngle = %MouseRotationAnglePart% MouseRotationAngle *= 45 ToolTip, Mouse rotation angle: %MouseRotationAngle%° SetTimer, RemoveToolTip, 1000 Return ;Wheel ButtonWheelSpeedUp: MouseWheelSpeed:=MouseWheelSpeed+2 ButtonWheelSpeedDown: MouseWheelSpeed-- If (MouseWheelSpeed>MouseWheelMaxSpeed) MouseWheelSpeed:=MouseWheelMaxSpeed If (MouseWheelSpeed<=1) MouseWheelSpeed:=1 RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines MouseWheelSpeedTemp:=MouseWheelSpeed*MouseWheelSpeedMultiplier If (MouseWheelSpeedTemp=1) ToolTip, Mouse wheel speed: %MouseWheelSpeedTemp% line Else ToolTip, Mouse wheel speed: %MouseWheelSpeedTemp% lines SetTimer, RemoveToolTip, 1000 Return ButtonWheelAccelerationSpeedUp: MouseWheelAccelerationSpeed:=MouseWheelAccelerationSpeed+2 ButtonWheelAccelerationSpeedDown: MouseWheelAccelerationSpeed-- If (MouseWheelAccelerationSpeed<=1) MouseWheelAccelerationSpeed:=1 RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines MouseWheelAccelerationSpeedTemp:=MouseWheelAccelerationSpeed*MouseWheelSpeedMultiplier If (MouseWheelAccelerationSpeedTemp=1) ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedTemp% line/cycle Else ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedTemp% lines/cycle SetTimer, RemoveToolTip, 1000 Return ButtonWheelMaxSpeedUp: MouseWheelMaxSpeed:=MouseWheelMaxSpeed+2 ButtonWheelMaxSpeedDown: MouseWheelMaxSpeed-- If (MouseWheelSpeed>MouseWheelMaxSpeed) MouseWheelSpeed:=MouseWheelMaxSpeed If (MouseWheelMaxSpeed<=1) MouseWheelMaxSpeed:=1 RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines MouseWheelMaxSpeedTemp:=MouseWheelMaxSpeed*MouseWheelSpeedMultiplier If (MouseWheelMaxSpeedTemp=1) ToolTip, Mouse wheel max speed: %MouseWheelMaxSpeedTemp% line Else ToolTip, Mouse wheel max speed: %MouseWheelMaxSpeedTemp% lines SetTimer, RemoveToolTip, 1000 Return ButtonWheelRotationAngleUp: MouseWheelRotationAnglePart:=MouseWheelRotationAnglePart+2 ButtonWheelRotationAngleDown: MouseWheelRotationAnglePart-- If(MouseWheelRotationAnglePart>=8) MouseWheelRotationAnglePart:=0 If(MouseWheelRotationAnglePart<0) MouseWheelRotationAnglePart:=7 MouseWheelRotationAngle = %MouseWheelRotationAnglePart% MouseWheelRotationAngle *= 45 ToolTip, Mouse wheel rotation angle: %MouseWheelRotationAngle%° SetTimer, RemoveToolTip, 1000 Return RemoveToolTip: SetTimer, RemoveToolTip, Off ToolTip ReturnOlder version can be found at AutoHotkey Script Showcase online.
Complaints, suggestions, questions... are all accepted. Of course, I don't accept to receive new mouse devices, because you know what this script is about...