If I have two identical applications side-by-side on my desktop, is there software that exists that will mimic what I do on the left half on the right? Basically, if my screen is 1000x1000 and a click event happens at 5,5, I would also like it to fire that event at 505,5 (mirrored on the X-axis). I'd like to emulate keyboard and mouse events.
141 Answer
(Knocking out a preliminary script that did the basic function was about as easy as I thought. It took only a few minutes and worked reasonably well. The problem is that there are lots of little gotchas and edge-cases where something might not work in some specific circumstance or if some other specific expectation exists. I’m still working on an enhanced version of the script that handles double-clicks and dragging, but while there’s plenty of examples and attempts, there are no solid, effective, and concise examples of handling these quite right at this time, so it’s a work in progress.)
In any case, the script below is an older version that I threw together (and cleaned up a bit for public consumption). It does what was asked (and a little more). There’s no real manual; you just run the script and it starts up in the mirroring mode. Mouse-clicks on either side of the screen are duplicated on the other (vertical) half. There are a few hotkeys that can be used to modify the script behavior:
- Alt+Shift+Q turns mirroring on and off
- Ctrl+Shift+Q turns autofire (rapid-repeat) on and off
- Ctrl+Alt+Shift+Q pauses the script so that the mouse behaves normally
- Ctrl+Alt+Shift+Win+Q exits the script
Here is a sample output of the script:

Mirror.ahk
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Mirror.ahk mirrors mouse clicks on one half of the screen to the other half ; ; ; (cl) 2012- Synetech inc., Alec Soroudi ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Hotkeys: ; Alt+Shift+Q to toggle mirroring ; Ctrl+Shift+Q to toggle autofire ; Ctrl+Alt+Shift+Q to completely pause the script (mouse behaves normally) ; Ctrl+Alt+Shift+Win+Q to quit ; ; Defaults to single-click, mirrored ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #SingleInstance force CoordMode, Mouse, Screen SetDefaultMouseSpeed, 0 SetMouseDelay, -1 SendMode Play ;Try modes Event, Input, or Play ;Variables SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index% Half := (MonitorWorkAreaRight - MonitorWorkAreaLeft) >> 1 Mirror := 1 Autofire := 0 ;Main function Dupe(action, var) { ;Calculate other half MouseGetPos, x,y Global Half if (x<Half) { Left := (Half + x) } else { Left := (x - Half) } Global Mirror if (action=0) { ;Mouse if (var=0) { ;Left-click if Mirror Click %Left% %y% Left Click %x% %y% Left } else if (var=1) { ;Right-click Click %Left% %y% Right Click %x% %y% Right } else if (var=2) { ;Middle-click Click %Left% %y% Middle Click %x% %y% Middle } else if (var=3) { ;Button4-click Click %Left% %y% X1 Click %x% %y% X1 } else if (var=4) { ;Button5-click Click %Left% %y% X2 Click %x% %y% X2 } } ; else if (action=1) { ;Keyboard - do what??? ; } } ;Hotkeys !+q:: ;Pause mirroring with Alt+Shift+Q Mirror := !Mirror ; MsgBox Mirror: %Mirror% return ^+q:: ;Toggle autofire with Ctrl+Shift+Q Autofire := !Autofire ; MsgBox Autofire: %Autofire% return ^!+q:: ;Pause script with Ctrl+Alt+Shift+Q Suspend ; if (A_IsSuspended = 1) ; MsgBox Hotkeys suspended ; else ; MsgBox Hotkeys resumed return ^!+#q:: ;Quit with Ctrl+Alt+Shift+Win+Q ; MsgBox Quitting ExitApp return +#q:: ;Reload/restart script with Shift+Win+Q ; MsgBox Reloading Reload return ;Handlers *$LButton:: Loop { ; if (Mirror) Dupe(0, 0) GetKeyState, State, LButton, P if (!Autofire || State = "U") Break } return *$RButton:: Loop { if (Mirror) Dupe(0, 1) GetKeyState, State, RButton, P if (!Autofire || State = "U") Break } return *$MButton:: Loop { if (Mirror) Dupe(0, 2) GetKeyState, State, MButton, P if (!Autofire || State = "U") Break } return *$XButton1:: Loop { if (Mirror) Dupe(0, 3) GetKeyState, State, XButton1, P if (!Autofire || State = "U") Break } return *$XButton2:: Loop { if (Mirror) Dupe(0, 4) GetKeyState, State, XButton2, P if (!Autofire || State = "U") Break } return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 4