The points are the intervalEdit value + 1 (for the starting position). So it moves to the starting position and then moves the intervalEdit value times.
Also here is the same, but I added in some commented mousemove code so you can see how to change how fast the mouse moves between the points.
Code: Select all
#SingleInstance, Force
CoordMode, Mouse, Screen
SetBatchLines, -1
Handles := _CreateGui()
return
GuiClose:
GuiContextMenu:
*ESC::ExitApp
SetPositions:
While( !GetKeyState( "ctrl" ) ){
MouseGetPos, x , y
ToolTip, Set Position 1: `nMove your cursor to your Starting Position `nand then press the "ctrl" key to lock it.`nX: %x% `tY: %y%
sleep, 30
}
SoundBeep, 500
;Create a vector object with the starting position
StartingPosition := New Vector( x , y )
KeyWait, ctrl
While(!GetKeyState("ctrl")){
MouseGetPos, x , y
ToolTip, Set Position 2: `nMove your cursor to your Ending Position `nand then press the "ctrl" key to lock it.`nX: %x% `tY: %y%
sleep, 30
}
ToolTip,
SoundBeep, 500
;Create a vector object with the ending position
EndingPosition := New Vector( x , y )
return
PlayBack:
;Get the values from the gui edits
for, k, v in Handles
GuiControlGet, %k% , 1: , % v
;Set / Reset the value of "currentPosition" to be the starting position selected by the user
CurrentPosition := New Vector( StartingPosition.X , StartingPosition.Y )
;Get the distance between the starting and ending positions. This is used with the intervals value to determin how far to move for each step.
Distance := EndingPosition.Dist( CurrentPosition )
;Create a new vector object that will be used to calculate the change in position
PositionUpDate := New Vector()
;Move the cursor to the starting position
DllCall("SetCursorPos", "int", StartingPosition.X, "int", StartingPosition.Y)
;wait the delay value amount of time
Sleep, % DelayEdit
;Loop the number of interval times set by the user minus 1 (moves = interval + 1 ( the starting position move ) )
Loop, % IntervalEdit - 1 {
;Reset the "PositionUpDate" vector object with the ending position values so new calculations can be made
PositionUpDate.X := EndingPosition.X , PositionUpDate.Y := EndingPosition.Y
;Subtract the value of "currentPosition" to get a vector that points from the current position to the ending position
PositionUpDate.Sub( CurrentPosition )
;Take the vector and scale it down to the distance to move for each interval
PositionUpDate.SetMag( Distance / IntervalEdit )
;Add the scaled vector to the current position
CurrentPosition.Add( PositionUpDate )
;Move the cursor to the current position
DllCall("SetCursorPos", "int", CurrentPosition.X, "int", CurrentPosition.Y)
;~ MouseMove, CurrentPosition.X , CurrentPosition.Y , 20 ;For slower movements
;wait the delay value amount of time
Sleep, % DelayEdit
}
;Move the cursor one last time to the endingposition
DllCall("SetCursorPos", "int", EndingPosition.X, "int", EndingPosition.Y)
;~ MouseMove, EndingPosition.X , EndingPosition.Y , 20 ;For slower movements
return
_CreateGui(){
local Handles := {}
Gui, 1:+AlwaysOnTop HwndGuiHwnd
Gui, 1:Add, Text, xm ym ,Intervals:
Gui, 1:Add, Edit, x+10 w50 r1 Number Center hwndhwnd, 100
Handles.IntervalEdit := hwnd
Gui, 1:Add, Text, xm , Delay Between Intervals [ms]:
Gui, 1:Add, Edit, x+10 w50 r1 Number Center hwndhwnd, 10
Handles.DelayEdit := hwnd
Gui, 1:Show,
WinGetPos,,, w ,, % "ahk_id " GuiHwnd
Gui, 1:Add, Button, % "xm w" w / 2 - 20 " gSetPositions", Set Positions
Gui, 1:Add, Button, % "x+10 w" w / 2 - 15 " gPlayBack", > PlayBack
Gui, 1:Show, AutoSize, Vector Move
return Handles
}
Class Vector {
__New(x:=0,y:=0){
This.X:=x,This.Y:=y
}Add(Other_HB_Vector){
This.X+=Other_HB_Vector.X,This.Y+=Other_HB_Vector.Y
}Sub(Other_HB_Vector){
This.X-=Other_HB_Vector.X,This.Y-=Other_HB_Vector.Y
}mag(){
return Sqrt(This.X*This.X + This.Y*This.Y)
}magsq(){
return This.Mag()**2
}setMag(in1){
m:=This.Mag(),This.X := This.X * in1/m,This.Y := This.Y * in1/m
return This
}dist(in1){
return Sqrt(((This.X-In1.X)**2) + ((This.Y-In1.Y)**2))
}
}