用途:
在需要大量使用复制粘贴时,总是按Ctrl+c,Ctrl+v,小手指太累了,需要一个方便的快捷键,想只按c复制,只按v粘贴。
考虑到复制粘贴都需要先选中,因此可以通过鼠标长按和鼠标位置移动来判断。
逻辑:
- 左键按下时记录当前鼠标位置,等待按键释放判断是否长按,T0.4指定超时时间0.4秒,即在400毫秒内释放了鼠标左键,直接返回,如果超过了0.2秒,则设置全局变量Mode为1
- 获取鼠标位置,判断鼠标x,y坐标是否移动了一定距离,没有则意味着鼠标只是长按,而没有拖动,所以可以认定没有选中内容,这个数字可以自己更改,我这里一个字的高是24像素,所以以10为最小距离。
- 开启一个3秒的定时器,超时后判断如果模式不为0,则强制清零,也就是说,选择内容后,必须在3秒内复制粘贴,可以改时间,也可以改逻辑,比如超时后只判断模式是否是1,即限制3秒内复制,但不限制粘贴时间。其实如果已经复制了,但没来得及粘贴,模式被清零了,也可以用Ctrl+v的方式粘贴,因为内容已经在粘贴板了,失效的只是粘贴快捷方式。
- 按C键,如果模式为1,则发送复制组合键,"^"是Ctrl键,然后模式设置为2,如果模式不是1,则设置模式为0
- 按V键和C键同样的逻辑。
备注:{Blind}是指定盲从模式,如果没有这个,Send里面是小写,那不管是否开大写,发送的都会是小写,加上了这个,开了大写,发送的就是大写,没开则发送小写。
代码:
#Requires AutoHotkey v2.0
CV_Mode := 0
~LButton:: {
global CV_Mode
x1 := 0
y1 := 0
x2 := 0
y2 := 0
MouseGetPos(&x1, &y1)
if(KeyWait("LButton", "T0.4")) {
return
}
MouseGetPos(&x2, &y2)
if((abs(x1 - x2) < 10) || (abs(y1 - y2) < 10)) {
return
}
CV_Mode := 1
SetTimer(CV_Mode_Off, 3000)
}
$c:: {
global CV_Mode
if(CV_Mode == 1) {
Send("^c")
CV_Mode := 2
}
else {
Send("{Blind}c")
CV_Mode := 0
}
}
$v:: {
global CV_Mode
if(CV_Mode == 2) {
Send("^v")
}
else {
Send("{Blind}v")
}
CV_Mode := 0
}
CV_Mode_Off()
{
global CV_Mode
if(CV_Mode != 0) {
CV_Mode := 0
}
SetTimer(CV_Mode_Off, 0)
}
2024/3/14更新,用另一种写法,增加Esc和鼠标右键强制退出复制模式。
两份代码都可以使用,看个人喜好。
#Requires AutoHotkey >= 2.0
Condition := false
PreX := 0
PreY := 0
PreTime := 0
#HotIf (Condition == 1)
c::{
global Condition
Send("^c")
str := A_Clipboard
Condition := 2
}
#HotIf (Condition == 2)
v::{
global Condition
Send("^v")
Condition := 0
}
#HotIf
ModeOff()
{
global Condition
if(Condition) {
Condition := 0 ; 强制退出copy模式
A_Clipboard := "" ; 清空粘贴板
}
}
~RButton::ModeOff()
~Esc::ModeOff()
~LButton::{
global
MouseGetPos(&PreX, &PreY)
PreTime := A_TickCount
}
~LButton Up::{
global Condition, PreX, PreY, PreTime
curX := 0
curY := 0
MouseGetPos(&curX, &curY)
curTime := A_TickCount
diffX := abs(curX - PreX)
diffY := abs(curY - PreY)
diffTime := abs(curTime - PreTime)
; ToolTip("x: " diffX " y: " diffY " t: " diffTime)
if((diffTime >= 200) && ((diffX >= 10) || (diffY >= 20))) {
Condition := 1
SetTimer(ModeOff, -2000)
; ToolTip("Trringle copy")
}
}