Is free you can test.
Code:
#SingleInstance Force
#Persistent
#NoEnv
#InstallKeybdHook
#InstallMouseHook
#MaxThreads 255
#MaxMem 4095
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
SetMouseDelay, -1
SendMode, Input
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%
sleep(period := 1, Mode := "P")
{
static Frequency, MinSetResolution, PID
if (Mode = "P")
{
pBatchLines := A_BatchLines
SetBatchLines, -1
if !Frequency
DllCall("QueryPerformanceFrequency", "Int64*", Frequency)
DllCall("QueryPerformanceCounter", "Int64*", Start)
Finish := Start + ( Frequency * (period/1000))
loop
DllCall("QueryPerformanceCounter", "Int64*", Current)
until (Current >= Finish)
SetBatchLines, %pBatchLines%
}
return
}
global spin_add, spin_sub, spin_total
$NumpadAdd::_spin_add()
$NumpadSub::_spin_sub()
$Right:: ; Spin Test Key
spin_total :=(spin_add - spin_sub) * 10
Loop, 10 {
Sleep 1
SendMouse_RelativeMove(spin_total, 0)
} return
_spin_add(){ ; Adds Units to Spin Duration
if (spin_total < 50000){
++spin_add
ToolTip, spin is now`n%spin_total%`n%spin_sub%`n%spin_add%
Sleep 1000
ToolTip
}else{
send, {NumpadAdd}
}
}
_spin_sub(){
if (spin_total >= 49999) {
--spin_sub
ToolTip, spin is now`n%spin_total%`n%spin_sub%`n%spin_add%
Sleep 1000
ToolTip
}else{
send, {NumpadSub}
}
}
SendMouse_RelativeMove(x, y){ ; send fast relative mouse moves
DllCall("mouse_event", "UInt", 0x01, "UInt", x, "UInt", y) ; move
}
$NumpadMult:: ; Clears Spin Units to 0
spin_add:=0
spin_sub:=0
return
middle_wheel:
*$MButton:: ; 180 Degree Turn
if (A_ThisHotKey && A_TimeSincePriorHotkey > 100){
SendMouse_RelativeMove(spin_total, 0)
}return
*$WheelLeft:: ; 90 Degree Left
if (A_ThisHotKey && A_TimeSincePriorHotkey > 100){
SendMouse_RelativeMove(-spin_total/2, 0)
}return
*$WheelRight:: ; 90 Degree Right
if (A_ThisHotKey && A_TimeSincePriorHotkey > 100){
SendMouse_RelativeMove(spin_total/2, 0)
}return