- M4M is a portable mouse chording configurator (built using CustomTkinter) that generates/tests
.ahk
scripts for mouse button combos - M4M can map macros to different mouse combos, for example, setting holding right click then left clicking once as the combo to perform Alt+Tab
- 146 distinct combos—also known as functions—can be defined to perform actions. Each of these combos has at most 3 and at least 2 ways of activation
- Combos with the same keys but different order are distinct from each other
- The original functions of your mouse buttons are retained by default
- Currently, any button/wheel/action (e.g. XButton3, mouse wheel tilt) other than the standard ones (left/right click, mouse wheel click/up/down, back and forward) cannot be mapped
- Basic knowledge of the AHK scripting langauge is required
- Download and install AutoHotkey v1.1
- Download
M4M_Configurator.zip
under Releases and run the.exe
file - Alternatively: Simply begin by defining macros under the 'Functions' section directly in the
.ahk
file - Test your script after finishing editing by running it!
- All available keys:
xBtn1
,xBtn1¦2
,xBtn2
,lBtn
,rBtn
,mBtn
,wUp
,wDown
, wherexBtn1¦2
refers to XButton1 and XButton2 held down together, regardless of order - Available 'modifier' keys:
xBtn1
,xBtn1¦2
,xBtn2
,lBtn
,rBtn
- '_' at the start indicates that the function only runs when nothing is held down
- '_' after a key refers to it having been used or it being held down
- '' at the end also implies that the function will only be activated after the last key in the combo 1 been released (given there is no '' at the start)
- '__' after a key means that the function will only be activated while it is held down
- '__' at the end also implies that the function activates while the last key in the combo is being held down (given there is no '_' at the start)
For example, if lBtn__rBtn__()
, lBtn__rBtn_()
and _lBtn__rBtn_()
are all defined, they will be activated in this order. lBtn__rBtn__()
on hold, lBtn__rBtn_()
on release of the last key in the combo, and _lBtn__rBtn_()
lastly. Also note that for example, _lBtn__rBtn_()
is valid whereas _lBtn__rBtn__()
is not.
xBtn1Used
,xBtn2Used
,lBtnUsed
,rBtnUsed
,mBtnUsed
,wUpUsed
,wDownUsed
xBtn1Count
,xBtn2Count
,lBtnCount
,rBtnCount
,mBtnCount
,wUpCount
,wDownCount
ForxxxHeld
conditions, useGetKeyState("xxx", "P")
- Add programs in which this script is not desired to be active to
exceptions
- Right-click drag is disabled by default due to performance complications
- 'Holding' and 'using' actions are not set apart for the second key in a 3-key combo. For example,
xBtn1__lBtn__rBtn_
does not exist, butxBtn1__lBtn_rBtn_
. This is to allow for quick actions (likexBtn2__rBtn__
as opposed to_xBtn2__rBtn_
), hold (likexBtn2__rBtn__wUp_
[which is not a valid function]) and deadkey actions to exist in the same function to reduce clutter - The 'l/rBtn__xBtn1¦2' combos are not available due to various complications. The 'l/rBtn__xBtn1/2' combos should be used instead (together with conditions)
- Default to original function when the last key in a combo is triggered if the comobo is not defined
- In GUI, add an option to disable the above feauture
- Make combos involving XButtonN configurable, where N > 2 and N
$\in \mathbb{N}$