( I also use a mouse configuration with button 4 of my mouse to L Alt+ Backspace and Button 3 linked to F1 it works like a charm )
Code:
;Gh0stM0use v4.2.3 by Gh0st
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#MaxHotkeysPerInterval 200
#InstallKeybdHook
#SingleInstance, Force
DetectHiddenWindows, on
SetControlDelay -1
SetBatchLines -1
Thread, Interrupt, 0
SetFormat, float, 0.0
toggle := false
inputPresent := false
mouseMoved := false
settingPoints := false
clickRate := 40
Mode := 0
pmx := 0
pmy := 0
totalClicks := 1
currentClick := 1
TempRateCPS := 25
TempRateSPC := 1
setTimer, checkMouseMovement, 10
setTimer, setTip, 5
TTStart = %A_TickCount%
while (A_TickCount - TTStart < 5000 && !toggle)
{
TooltipMsg = Press (Alt + Backspace) to toggle autoclicker `n Press (F1) for options
}
TooltipMsg = working at %clickRate%
F1::
IfWinNotExist, NIAC Settings
{
if settingPoints
{
toggle := false
settingPoints := false
actWin :=
TooltipMsg =
}
prevTC := totalClicks
Gui, Show, w210 h160, NIAC Settings
Gui, Add, Radio, x25 y10 gActEdit1 vmode, Clicks per second:
Gui, Add, Radio, x25 y35 gActEdit2, Seconds per click:
Gui, Add, Edit, x135 y8 w50 Number Left vtempRateCPS, % tempRateCPS
Gui, Add, Edit, x135 y33 w50 Number Left vtempRateSPC, % tempRateSPC
Gui, Add, Text, x30 y65, Total click locations:
Gui, Add, Edit, x133 y63 w50 Number Left vtotalClicks, % totalClicks
Gui, Add, Text, x0 w210 0x10
Gui, Add, Text, x27 y100, (Default is 25 clicks per second)
Gui, Add, Button, x60 y117 gReset, Reset
Gui, Add, Button, x112 y117 Default gSetVal, Set
Gui, Font, s6
Gui, Add, Text, x157 y150, V 4.2.3 by Gh0st
if mode < 2
{
GuiControl,, Mode, 1
GoSub, ActEdit1
}
else
{
GuiControl,, Seconds per click:, 1
GoSub, ActEdit2
}
}
else
WinActivate, NIAC Settings
return
ActEdit1:
GuiControl, Enable, tempRateCPS
GuiControl, Disable, tempRateSPC
GuiControl, Focus, tempRateCPS
Send +{End}
return
ActEdit2:
GuiControl, Enable, tempRateSPC
GuiControl, Disable, tempRateCPS
GuiControl, Focus, tempRateSPC
Send +{End}
return
Reset:
toggle := false
actWin :=
setTimer, autoClick, off
currentClick := 1
GuiControl, Disable, Reset
Gui, Font, s8
Gui, Add, Text, x54 y145, Click locations reset.
return
SetVal:
Gui, Submit
if mode < 2
clickRate := tempRateCPS > 0 ? 1000 / tempRateCPS : 1000
else
clickRate := tempRateSPC > 0 ? 1000 * tempRateSPC : 1000
if totalClicks != %prevTC%
{
toggle := false
actWin :=
setTimer, autoClick, off
}
GuiClose:
if toggle
{
EmptyMem()
setTimer, autoclick, %clickRate%
}
Gui, Destroy
return
!Backspace::
IfWinNotExist, NIAC Settings ; Only functional if options window is not open
{
toggle := !toggle
if toggle
{
setTimer, setTip, 5
if (!actWin) ; actWin value is also used to determine if checks are set. If they aren't:
{
settingPoints := true ; Used to allow break if options are opened
Loop, %totalClicks%
{
if totalClicks < 2
TooltipMsg = Click the desired autoclick location.
else
TooltipMsg = Click the location for point %A_Index%.
toggle := false
Keywait, LButton, D
Keywait, LButton
if !settingPoints ; Opening options sets this to false, breaking the loop
return
TooltipMsg =
newIndex := A_Index - 1
MouseGetPos, xp%newIndex%, yp%newIndex%
WinGet, actWin, ID, A
}
settingPoints := false
}
else ; If values ARE set (actWin contains data):
{
settingPoints := false
setTimer, setTip, 5
TTStart = %A_TickCount%
TooltipMsg = ##Autoclick enabled. %clickRate% | %totalClicks%
}
toggle := true
EmptyMem()
setTimer, autoclick, %clickRate%
}
else
{
setTimer, setTip, 5
TTStart = %A_TickCount%
TooltipMsg = ##Autoclick disabled.
setTimer, autoclick, off
}
}
return
setTip:
StringReplace, cleanTTM, TooltipMsg, ##
Tooltip, % cleanTTM
if (InStr(TooltipMsg, "##") && A_TickCount - TTStart > 1000)
TooltipMsg =
if TooltipMsg =
{
Tooltip
setTimer, setTip, off
}
return
checkMouseMovement:
if (WinExist("ahk_id" . actWin) || !actWin) ; If NIAC is clicking in a window, or the window isn't set, it's all good.
{
MouseGetPos, tx, ty
if (tx == pmx && ty == pmy)
mouseMoved := false
else
mouseMoved := true
pmx := tx
pmy := ty
}
else ; Otherwise, the target window has been closed.
{
Msgbox, 4, NIAC, Target window has been closed, `n Do you want to close Autoclicker as well?
IfMsgBox Yes
ExitApp
else
{
actWin :=
toggle := false
}
}
return
autoclick:
if !(WinActive("ahk_id" . actWin) && (A_TimeIdlePhysical < 50 && !mouseMoved))
{
cx := xp%currentClick%
cy := yp%currentClick%
ControlClick, x%cx% y%cy%, ahk_id %actWin%,,,, NA
currentClick := % Mod(currentClick + 1, totalClicks)
}
return
~*LButton up::
return
#If WinActive("ahk_id" . actWin) && toggle
$~*LButton::
MouseGetPos,,, winClick
if winClick = %actWin%
setTimer, autoclick, off
Send {Blind}{LButton Down}
return
$~*LButton up::
IfWinNotExist, NIAC Settings
setTimer, autoclick, %clickRate%
Send {Blind}{LButton Up}
return
EmptyMem()
{
pid:= DllCall("GetCurrentProcessId")
h:=DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1)
DllCall("CloseHandle", "Int", h)
}