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