Like most programmers, I've got two monitors and a dislike for taking my fingers off the home-row. On my Mac, I was inspired to write a Keyboard Maestro script to hot-key jump between my screens.
On Windows, I got by Alt-Tab'ing. I've got a new Windows box, and in the spirit of experimentation, I wondered if I could write a similar screen-jumping script for Windows.
The obvious choice was to build this in AutoHotKey. A quick Google Search turned up a similar request. A bit of MsgBox experimentation revealed that MouseGetPos returns positive x values for 'Monitor 1' and negative for 'Monitor 2'. SysGet can be used to determine the bounds of a monitor and MouseMove can be used to, well, move the mouse.
Once I had this figured out, I was able to build a version of a ScreenJump that hopped the mouse between the monitors. Version 1 plopped the mouse pointer in the center of the screen:
#SingleInstance,Force
CoordMode,Mouse,Screen
;; Windows+J does the jump
#j::
MouseGetPos,X,Y
If(X > 0) {
SysGet, M, Monitor, 2
Zone := -1
} else {
SysGet, M, Monitor,1
Zone := 1
}
CenterX := ((MRight - MLeft) / 2) * Zone
CenterY := (MBottom - MTop) / 2
MouseMove CenterX, CenterY, 0
return
After a few days, I refined the above function to capture the mouse coordinate and then jump to the other screen. I use these captured coordinates as the destination to jump back to, rather than always jumping to screen-center. Additionally, I added logic to give focus to the window the mouse lands on.
This function, triggered by Windows-j has become so embedded in muscle memory I can't help but wonder how I lived without. Such is the joy of keyboard shortcuts.
#SingleInstance,Force
CoordMode,Mouse,Screen
ScreenJump() {
MouseGetPos,X,Y
global LastM1X, LastM1Y, LastM2X, LastM2Y
;; X > 0 is one screen, X < 0 is another screen
;; Before we jump away from the screen, capture our
;; 'last' coordinates so we can return there.
If(X > 0) {
LastM1X := X
LastM1Y := Y
SysGet, M, Monitor, 2
Zone := -1
LastX := LastM2X
LastY := LastM2Y
} else {
LastM2X := X
LastM2Y := Y
SysGet, M, Monitor,1
Zone := 1
LastX := LastM1X
LastY := LastM1Y
}
;; Do we know our last position?
;; Great, jump there. If not, go to the center of the window.
if(LastX != "") {
CenterX := LastX
CenterY := LastY
} else {
CenterX := ((MRight - MLeft) / 2) * Zone
CenterY := (MBottom - MTop) / 2
}
;; Give Focus to the window the Mouse is hovering over.
MouseMove CenterX, CenterY
MouseGetPos,,,GuideUnderCursor
WinGetTitle, Title, ahk_id %GuideUnderCursor%
WinActivate, %Title%
return
}
#j:: ScreenJump()
No comments:
Post a Comment