;;用ahk实现类似wegestures的功能:按着右键时左甩复制,右甩粘贴,上滚home,下滚end等。直接下载wegestures更为强大,但如果鼠标有不止2个侧键可用这个ahk脚本作为补充,wegestures只支持2个侧键。以下为代码
;;获取鼠标在屏幕而非窗口中的位置
CoordMode, Mouse, Screen
CoordMode, ToolTip, Screen
SetKeyDelay, 0
SetMouseDelay, 0
;;右键按下获取当前活动窗口id、鼠标位置、鼠标指向窗口id、当前时间
rbutton::
WinGet, activeid, ID, A
MouseGetPos,x,y,mouseid
t := A_TickCount
Return
rbutton up::
;;如果右键按下在50ms-500ms之间抬起(按下右键-甩鼠标-抬起的时间),计算鼠标的横竖位移和,如果小于20像素,相当于手没有移动单击了右键,电脑执行右键单击。如果大于20像素,按鼠标向右、右上、上、左上、左、左下、下、右下八个方向甩动,执行不同的操作。
tt := A_TickCount-t
if(50 < tt and tt <= 500)
{
MouseGetPos,xx,yy
xxx := xx-x
yyy := yy-y
xy := Abs(xxx)+Abs(yyy)
if (xy<=20)
{
Send {rbutton}
}
else if (xy>20)
{
rate := yyy/xxx
if (xxx>0 and yyy<0 and -0.41 < rate and rate<=0 or xxx>0 and yyy>0 and 0<= rate and rate < 0.41)
{
;;激活鼠标指向窗口并粘贴
if activeid=mouseid
Send ^v
if activeid!=mouseid
WinActivate, ahk_id %mouseid%
WinWaitActive, ahk_id %mouseid%
Send ^v
;;在某坐标处显示提示框,700ms后消失,提示框消失的RemoveToolTip代码在最后
ToolTip, 粘贴, 1260, 640
SetTimer, RemoveToolTip, 700
}
if (xxx>0 and yyy<0 and -2.41<=rate and rate<=-0.41)
{
;;右上操作
}
if (xxx>0 and yyy<0 and rate< -2.41 or xxx<0 and yyy<0 and 2.41< rate or xxx=0 and yyy<0)
{
;;上操作
}
if (xxx<0 and yyy<0 and 0.41<= rate and rate <=2.41)
{
;;左上操作
}
if (xxx<0 and yyy<0 and 0<= rate and rate < 0.41 or xxx<0 and yyy>0 and -0.41 < rate and rate<=0)
{
Send ^c
ToolTip, 复制, 1260, 640
SetTimer, RemoveToolTip, 700
}
if (xxx<0 and yyy>0 and -2.41<=rate and rate<=-0.41)
{
;;左下操作
}
if (xxx<0 and yyy>0 and rate< -2.41 or xxx>0 and yyy>0 and 2.41< rate or xxx=0 and yyy>0)
{
;;下操作
}
if (xxx>0 and yyy>0 and 0.41<= rate and rate <=2.41)
{
;;右下操作
}
}
else if (0 <= tt and tt <= 50)
;;按下右键超过500ms再抬起算超时,不执行任何操作。为防止ahk计算时间差时大于500ms有时也得出50ms内(不知道为什么),小于50ms也不执行任何操作。不必担心快速单击右键没有执行,人单击鼠标时,鼠标被按下的时间一般都大于50ms。
{
}
}
Return
WheelUp::
;;按着右键上滚,home
GetKeyState,rbuttonp,rbutton,P
{
If (rbuttonp="D")
{
Send {f9}
;;f9是wegestures的开关,假如开着wegestures,要先关wegestures,执行home后再开,否则易使wegestures上滚失灵。小缺陷是每次执行都提示大大的“wegestures已启用”,又不能单独关掉wegestures启用的提示,可选择关掉所有提示。一般开了wegestures是开启常规鼠标键的手势功能,这时如果有多余的侧键,可使用ahk,注意一个侧键不要ahk和wegestures都占用,一开始会冲突,虽然最终仍可能共用。
t := 0
;;为了不让每次右键上滚执行home都额外执行一次右键单击,让t为0,当前时间减0必定大于500ms,使右键原来的功能超时失灵
Send {home}
Send {f9}
ToolTip, home, 1260, 640
SetTimer, RemoveToolTip, 700
}
else
{
;;单纯上滚还是上滚
Send {WheelUp}
}
}
Return
Wheeldown::
GetKeyState,rbuttonp,rbutton,P
{
If (rbuttonp="D")
{
Send {f9}
t := 0
Send {end}
Send {f9}
ToolTip, end, 1260, 640
SetTimer, RemoveToolTip, 700
}
else
{
Send {Wheeldown}
}
}
Return
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return