KeyWait,没有参数,默认,等待按键被释放。使用其它选项可以改。
使用D,等待按键被按下,使用L,测试按键的状态。T表示时间,在此期间。如果此参数为空, 则命令会无限期等待用户松开指定的按键或鼠标/操纵杆按钮.
e:: KeyWait,r,d,t1 if ErrorLevel MsgBox,0 Else MsgBox,no
在一秒钟内,按下r,keywait完成,errlrlevel设置为0,输出else的no。
这里有一个违背我逻辑的地方,一直都以为,完成、达到某种要求,会返回1,结果在keywait中,达成目的,返回0.
e:: KeyWait,r,l,t10 if ErrorLevel MsgBox,0 Else MsgBox,no
将d改成l,检测按键状态。直接按e,程序到达keywait行,在十秒钟时间里检测按键是否有被释放。长按r,启动热键e,放开r,被释放,那么值为0,输出else。坚持10秒不放开,没被释放,值为1,输出if。
这个命令感觉有点麻烦,不但有按键之间的关系,还有时间上的关系。
————————————
指令基本摸清楚了,开始实战吧。
在使用CAD过程中,每个命令都需要敲击一次空格,好麻烦,尝试使用长按来达到目的。
从命令e+空格入手
最终代码——目前在用
e:: keywait,e,,t1 if errorlevel=1 { send,e send,{space} return }
既不是D也不是L,所以会一直等下去,直到e被释放。因为设定了T,超时就为1,利用这一点,完成长按。
——结论
keywait就我目前的理解,只有errorlevel可以用,还有就是,这个指令完成后才能继续下一步的指令。
————
缺点,这样e就不能用了,只能长按激活热键,本身e的功能就废了。改。
花了不少时间去补之前的笔记。
回过神来回顾了一下keywait,发现···要么是条件能达到,比如说一定时间内释放或者按下,要么是超时与不超时,足够用了。
最终代码——目前在用
keywait,e,,t0.06 if errorlevel=0 { send,e return }
在0.06秒内,e不处于按下的状态,达到条件,值为0.
keywait,e,,t0.8 if errorlevel { send,e return }
在0.8秒内,e不处于按下的状态,值为0,这么理解就错了。因为我现在这个代码不论是长按还是短按,都是0.
在0.8秒内,e松开,就可以了。自己低估了计算机的计时器,其实在触发热键松开的之前,代码激活了计时器,可能都已经跑了几十几百了。
——————
到目前为止,我的功能要求已经实现了,单击不会影响字母的输出,好让它们可以组合,比如e和ex,长按可以完成指令发送。初衷是为了减少按键次数,但是,之前做了A_TimeSinceThisHotkey,发现和keywait类似,所以打算用keywait去实现双击和三击。
KeyWait,e,d,t1 If ErrorLevel { MsgBox,目标失败 Return } { MsgBox,成功 Return }
在测试这段代码的时候有点麻烦。按理说是在一秒钟内按下e,打成,值为1,成功。应该是这样才对。但是自己测试的时候,在注释掉之前的代码的情况下,按一次e,不论如何都是成功,完全没有还手的余地;在怀疑智商的同时,取消之前代码的注释,再来测试。发现不论如何,都不能激活两个窗口,长按也不能激发快捷键了,怀疑是T的问题。
————————
代码全部由一个快捷键激活,脚本从上往下开始执行,所以代码的先后顺序很重要,时间也很重要。
在完成第一层代码目标的时候,等待T,在T完成之前,触发第二层代码目标,等待T2,以此类推,暂时这么理解。
——————
最后找到bug的原因比较狗血,不值得一说。
————
e:: KeyWait,e,,t1.5 ;在1.5秒钟内等待e松开 If ErrorLevel send,长按超过1.5秒 Else Send,单击 KeyWait,e,d,t1 ;在1秒内按下e If ErrorLevel send,失败 Else Send,成功 KeyWait,e,d,t0.5 If ErrorLevel send,123 Else Send,666
直接去测试,不论单击还是双击还是三击,都可以得到三个数据。只要筛选好,就能直接使用,把多余的删除就行。所谓多余,不论有没有else,重点errorlevel都会改变,代码可以继续下一行,不会影响之后的判断。
代码操作逻辑——热键开始的时候默认松开,按下,松开,按下,松开。(热键开始默认松开这个结论得得蛋疼,百思不得···)
终究我放弃这段代码了,变数好大···不玩了···
——+——+——+——+——+——+——+——
在实际使用过程中,发现rec需求比较大,犹豫上面的指令设定和时间紧密相关,所以使用起来有延迟,短短几毫秒的延迟,虽然不多,但是和以前相比,手指还是能感觉出来的。
解决办法,让keywait等一个e,也就是r激活热键,然后等e。
————————————————————
他人优秀代码学习:
p:: keywait,p,T0.2 if errorlevel { msgbox,超时 return } keywait,p,D T0.13 if errorlevel { msgbox,单击 return } keywait,p,T0.07 if errorlevel { msgbox,双击 return } keywait,p,D T0.13 if errorlevel { msgbox,双击 return } MsgBox,三击 Return
————————————————————————————————————————
在实际使用过程中,又发现了点问题,不算大,但也是心中的结。从代码来看,我只能使用单击+长按,或者一次单击+快速双击+慢速双击,以A_TimeSinceThisHotkey和本人对keywait的理解,尚不能完成三连击的效果,对知识点消化不良,所以也不打算直接借用上面的代码。
最终代码——起初在参考文档和上面代码的时候,思考逻辑被自己限定死了。
e:: KeyWait,e,,t0.2 if ErrorLevel { SendInput,长按 return } KeyWait,e,d,t0.15 if ErrorLevel { send,一次 return } KeyWait,e,t0.8 KeyWait,e,d,t0.1 if ErrorLevel { send,两次 return } else { send,三次 }
代码从上往下,要忽视等待时间,只能给出false。计时器激活的瞬间,可能物理键盘上的按键还没来得及松开。
第一次按键,按下的时候,激活热键,热键在被激活的瞬间,就开始计时,等待0.2秒,在此期间,松开按键,第一次按键完成,同时激活下一个一次定时器;在0.15秒内再次按下e,任务完成,errorlevel=0,条件判断无效,继续下一个定时器;这个定时器没有任何语句,但是作用不小。在第二次按下e的时候,计时器已经开始工作,很有可能会影响按键的判断,这0.8秒是用来解决激活按键到松开按键延时的问题,只要在0.8秒内松开按键,就可以正常进行第三次按键了,这0.8秒是给自己留的余地,这是最关键的一步了。之后有0.1秒的时间去第三次按键,超时就输出两次。
起初第三步不是0.8秒,是0.13秒,测试的时候发现一个问题。如果第一次短按,第二次长按,没有第三次按键,那么会默认输出三次,也就是第二次按键没松开,被最后一个计时器等到了。为了防止这样的情况,所以延长了时间,再超过我也没办法了,这TM也不算双击了。
最终代码——长按、单击、单击+长按、双击、三击。
e:: KeyWait,e,,t0.2 if ErrorLevel { SendInput,长按 return } KeyWait,e,d,t0.15 if ErrorLevel { send,一次 return } KeyWait,e,t0.8 if ErrorLevel { send,短按长按666 return } KeyWait,e,d,t0.1 if ErrorLevel { send,两次 return } else { send,三次 return }
在此基础上修改出双击+长按也是可行的。现在脉络清清楚楚,想怎么改都可以了,这让我想到了单片机的延时消抖···经验很重要,多接触,多积累。为什么一开始想不到,而是任务完成了才想到···只能说自己动手少···唉······