Wrote my own script in v2 since scripts in previous answers are in v1.
- Works with any number of monitors.
- Handles different DPI res on different monitors.
- Forward/back mouse buttons switch to next/previous monitor.
- Will move cursor to same (scaled) relative position on monitor switched to
#SingleInstance Force
MouseSwitchMonitor(switchNumber := 1) {
DllCall("SetThreadDpiAwarenessContext", "ptr", -3, "ptr") ; handles multiple monitors with different DPI settings
CoordMode("Mouse", "Screen")
count := MonitorGetCount()
if (count <= 1) {
return
}
MouseGetPos(&mouseX, &mouseY)
relativeMouseX := 0.5
relativeMouseY := 0.5
mouseMonitor := 0
monitors := {}
counter := 1
Loop count {
actual := MonitorGet(counter, &left, &top, &right, &bottom)
monitors.%actual% := {left: left, top: top, right: right, bottom: bottom}
if (left <= mouseX && mouseX < right && top <= mouseY && mouseY < bottom) { ; from testing, seems mouse position can be left or top but not right or bottom
mouseMonitor := actual
relativeMouseX := (mouseX - left) / (right - left)
relativeMouseY := (mouseY - top) / (bottom - top)
}
counter++
}
mouseMonitor := Mod(mouseMonitor - 1 + Mod(switchNumber, count) + count, count) + 1 ; modular arithmetic to cycle, and make sure 1 <= mouseMonitor <= count
if (!HasProp(monitors, mouseMonitor)) {
return
}
monitor := monitors.%mouseMonitor%
MouseMove(monitor.left + Floor(relativeMouseX * (monitor.right - monitor.left)), monitor.top + Floor(relativeMouseY * (monitor.bottom - monitor.top)), 0) ; since mouse position can be left or top, but not right or bottom
}
XButton1::MouseSwitchMonitor(-1) ; backward mouse button, previous monitor
XButton2::MouseSwitchMonitor(1) ; forward mouse button, next monitor