AHK V2自用脚本:方便的CV大法

本文介绍了一种利用AutoHotkey编程实现的快捷方式,通过鼠标长按和位置判断来自动执行复制(C键)和粘贴(V键)操作,避免频繁使用Ctrl+C和Ctrl+V,提高了工作效率。
摘要由CSDN通过智能技术生成

用途:

在需要大量使用复制粘贴时,总是按Ctrl+c,Ctrl+v,小手指太累了,需要一个方便的快捷键,想只按c复制,只按v粘贴。
考虑到复制粘贴都需要先选中,因此可以通过鼠标长按和鼠标位置移动来判断。

逻辑:

  1. 左键按下时记录当前鼠标位置,等待按键释放判断是否长按,T0.4指定超时时间0.4秒,即在400毫秒内释放了鼠标左键,直接返回,如果超过了0.2秒,则设置全局变量Mode为1
  2. 获取鼠标位置,判断鼠标x,y坐标是否移动了一定距离,没有则意味着鼠标只是长按,而没有拖动,所以可以认定没有选中内容,这个数字可以自己更改,我这里一个字的高是24像素,所以以10为最小距离。
  3. 开启一个3秒的定时器,超时后判断如果模式不为0,则强制清零,也就是说,选择内容后,必须在3秒内复制粘贴,可以改时间,也可以改逻辑,比如超时后只判断模式是否是1,即限制3秒内复制,但不限制粘贴时间。其实如果已经复制了,但没来得及粘贴,模式被清零了,也可以用Ctrl+v的方式粘贴,因为内容已经在粘贴板了,失效的只是粘贴快捷方式。
  4. 按C键,如果模式为1,则发送复制组合键,"^"是Ctrl键,然后模式设置为2,如果模式不是1,则设置模式为0
  5. 按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")
    }
}


  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值