Tuesday 1 May 2018

windows 7 - Can I mirror / duplicate mouse events on both halves of my screen?


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.



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:


Screenshot of Mirror.ahk output


Mirror.ahk


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Mirror.ahk mirrors mouse clicks on one half of the screen to the other half
; http://superuser.com/questions/393738/
;
; (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 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

No comments:

Post a Comment

Where does Skype save my contact's avatars in Linux?

I'm using Skype on Linux. Where can I find images cached by skype of my contact's avatars? Answer I wanted to get those Skype avat...