;;KBD D events stop execution, so _H it is. Menu, Tray, Tip, Mouse On Keyboard #MaxThreadsPerHotkey 2 #HotkeyInterval 10000 #MaxHotkeysPerInterval 9999 #NoEnv #WarnContinuableException Off #Persistent ;;Retrieving 1st screen's resolution SysGet, screenX, 16 ;;"SM_CXFULLSCREEN" SysGet, screenY, 17 ;;"SM_CYFULLSCREEN" screenXExtraFactor := 1.02 screenYExtraFactor := 0.10 ;;DllCall("mouse_event", "UInt", 1, "UInt", (rightMov + lefMov) , "UInt", upMov + downMov ) ;;AHK unaware del futuro de los escritorios. ;;https://www.autohotkey.com/boards/viewtopic.php?t=97706 DllCall("SetThreadDpiAwarenessContext", "ptr", -3, "ptr") freqUpdater := DllCall("GetProcAddress", "Ptr" , DllCall("GetModuleHandle", "Str", "kernel32", "Ptr"), "AStr", "QueryPerformanceCounter", "Ptr") ;;VarSetCapacity(baseTime, 2334423432128) ;;VarSetCapacity(currentTime, 423523423128) DllCall(freqUpdater, "Int64*" , baseTime) DllCall(freqUpdater, "Int64*" , currentTime) DllCall("QueryPerformanceFrequency", "Int64*", updateRate) updateRate := updateRate / 1000 currentTime := currentTime ;;/ 1.0 baseTime := baseTime ;;/ 1.0 mouseActive := 0 rBtnHold := 0 mBtnHold := 0 lBtnHold := 0 defaultSpeed := 10 slowDown := 0 slowDownFactor := 90 test1 := 0 test2 := 0 test3 := 0 test4 := 0 pressMouseButton(ByRef mouseButton, ByRef keyPressed, ByRef toggleState := 0, ByRef toggle := 0) { Global mouseActive if(mouseActive == 1) { if (toggleState == 1) { MouseClick, %mouseButton%, , , 1, , U toggleState := 0 ;;return } else if (toggleState == 0 && toggle == 1) { MouseClick, %mouseButton%, , , 1, , D toggleState := 1 ;;return } else if (toggle == 0) { MouseClick, %mouseButton% ;;return } } KeyWait, %keyPressed% return } share:=CriticalObject({"lefMov" : 0,"rightMov" : 0,"downMov" : 0,"upMov" : 0,"mouseSpeed" : slowDown * slowDownFactor + defaultSpeed}) LAlt & RAlt:: RAlt & LAlt:: ;;<^>!LAlt:: ;;LAlt & RAlt:: mouseActive := !(mouseActive) if (mouseActive == 1) { mouseThread := AhkThread(" ( #Persistent Process, Priority, , H DllCall(""SetThreadDpiAwarenessContext"", ""ptr"", -3, ""ptr"") freqUpdater := DllCall(""GetProcAddress"", ""Ptr"" , DllCall(""GetModuleHandle"", ""Str"", ""kernel32"", ""Ptr""), ""AStr"", ""QueryPerformanceCounter"", ""Ptr"") ;;VarSetCapacity(baseTime, 2334423432128) ;;VarSetCapacity(currentTime, 423523423128) DllCall(freqUpdater, ""Int64*"" , baseTime) DllCall(freqUpdater, ""Int64*"" , currentTime) DllCall(""QueryPerformanceFrequency"", ""Int64*"", updateRate) ticksPerSecond := 1000 updateRate := Floor(updateRate / ticksPerSecond) currentTime := currentTime ;;/ 1.0 baseTime := baseTime ;;/ 1.0 ;;This do be Ugly AF. Probably gonna stay this way. obj := CriticalObject(A_Args[1]) lefMov := obj.lefMov rightMov := obj.rightMov downMov := obj.downMov upMov := obj.upMov mouseSpeed := obj.mouseSpeed delta := 0 Loop { DllCall(freqUpdater, ""Int64*"" , currentTime) if (currentTime - baseTime >= updateRate) { delta := (currentTime - baseTime) / ticksPerSecond MouseMove, (obj.rightMov + obj.lefMov) * (delta / obj.mouseSpeed), (obj.upMov + obj.downMov) * (delta / obj.mouseSpeed), 0, R ;;DllCall(freqUpdater, ""Int64*"" , baseTime) baseTime := currentTime } } )", &share "") } else { mouseThread.ahkTerminate() ;;ahkthread_free(mouseThread) share.lefMov := 0 test1 := 0 share.rightMov := 0 test2 := 0 share.upMov := 0 test3 := 0 share.downMov := 0 test4 := 0 lBtnHold := 0 mBtnHold := 0 rBtnHold := 0 ;;break } return #if mouseActive == 1 ;;Toggle speed sc028:: h:: Global share ;;SendInput, {RCtrl Up} slowDown := !(slowDown) share.mouseSpeed := slowDown * slowDownFactor + defaultSpeed ;;SendInput, {RCtrl Down} return ;;Tuck away ;;TODO: comprobar puntero en local ;;Targeting 1080p displays with taskbar on top. Should adapt to any single monitor setup. sc01A:: ;;y:: ;;DllCall("ShowCursor", "Int", slowDown ) MouseMove, floor(screenX * screenXExtraFactor), floor(screenY * screenYExtraFactor) ;;inputCleaning() return $j:: if (test1 == 0) { test1 := 1 share.lefMov := -1 } return j Up:: share.lefMov := 0 test1 := 0 return $sc027:: if (test2 == 0) { test2 := 1 share.rightMov := 1 } return sc027 Up:: share.rightMov := 0 test2 := 0 return $l:: if (test3 == 0) { test3 := 1 share.upMov := -1 } return l Up:: share.upMov := 0 test3 := 0 return $k:: if (test4 == 0) { test4 := 1 share.downMov := 1 } return k Up:: share.downMov := 0 test4 := 0 return #MaxThreadsPerHotkey 1 $u:: pressMouseButton("Left", "u", lBtnHold) return u Up::return $m:: pressMouseButton("Left", "m", lBtnHold, 1) return m Up::return $i:: pressMouseButton("Middle", "i", mBtnHold) return i Up::return $sc033:: pressMouseButton("Middle", "sc033", mBtnHold, 1) return sc033 Up::return $o:: pressMouseButton("Right", "o", rBtnHold) return o Up::return $.:: pressMouseButton("Right", ".", rBtnHold, 1) return . Up::return $p:: pressMouseButton("X2", "p") return p Up::return $sc035:: pressMouseButton("X1", "sc035") return sc035 Up::return $n:: pressMouseButton("WD", "n") return n Up::return $y:: pressMouseButton("WU", "y") return y Up::return #if return