MouseGetPos, x, y if x<500 { MsgBox,小于设定值 } Else { MsgBox,大于设定值 } Return
获取的软件坐标active,不是屏幕坐标。也能达到目的,设定相对的值,如果软件大小不够的话,我使用的时候点击一下大软件,应该都可以达到一定的像素位置,再者说,在桌面上的话也是可以运行。
结论,在全屏软件中正常使用,在窗口软件中异常,需要切换活动窗口,可以利用点击。还是太麻烦了。
——————
“CoordMode,为多个命令设置坐标模式,相对于活动窗口还是屏幕。”
第一行之前添加代码——CoordMode,mouse,screen
坐标获取默认全局,nice,继续吧。
————————————————————
CoordMode,mouse,screen !w:: MouseGetPos, x, y if (x<10)&&(y<10) ;这里要注意使用括号 { MsgBox,在屏幕左上角 } Else { MsgBox,位置不对,或者脚本有错 } Return
可以正常使用,但是脚本必须要有热键触发才行,能否省去这一步呢?使用循环吗?一直循环比大小?cpu和内存占用会不会大···
————————————————————
花了不少时间,放弃了,尝试过SetTimer,连它最基本的使用方法都没摸索出来···
——————
结论:能力不行,不用循环了,就用热键去触发好了。这样一来有一个好处,就是我可以将屏幕分成若干块,在每一个区域使用同一个热键可以达到不同的效果。这一点是循环检测坐标无法达到的,毕竟,从A区到C区,有可能经过B区,有可能绕过D区,如果路过都要判定生效的话,那的确有点混乱。一开始如果有这种觉悟的话,不就不需要去摸索,直接就能开始做了···
还有就是,所有的热键,全部可以利用屏幕区域的划分,完成更多的功能··
————收获——————
MouseGetPos,获取鼠标指针的坐标,ahk果然有这个功能。
CoordMode,设定坐标是相对定位还是绝对定位。
在寻找循环检测的方法时,发现了一个命令#Persistent,可以让脚本一直存在,不过这回没用上。
GetKeyState,获取按键的状态,按下或者放开。
在使用循环while的时候,测试使用了文档中的实例
~LButton:: MouseGetPos, begin_x, begin_y while GetKeyState("LButton") { MouseGetPos, x, y ToolTip, % begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y) Sleep, 10 } ToolTip return
热键lbutton的前面有一个~,好奇啊,去掉了之后重新运行脚本,鼠标左键失效了···但是脚本功能还在。于是将热键替换成ctrl,发现ctrl失效,脚本不工作了。
结论:~可以让当前热键生效的同时不会屏蔽原有按键的意义,而mousegetpos这个指令貌似不能通过除指针外的命令激发,不想去测试了。
————
最终代码——使用alt+tab,限定时间20秒。
~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { ;~ send #{tab} Send {Alt Down} ;默认alt按下,一直处于按下状态,直到物理键盘alt按了,释放了,才行。 Send {tab} ;这次功能之所以不能实现,主要是因为alt的特殊性,在热键中使用了!就会引发alt键弹起,就不能维持效果。 KeyWait,lbutton,d t20 if errorlevel>0 ;超时为1,否则为0 { Send {esc} Send {alt up} } Else Send {alt up} Return } Return
不足——需要限定时间,可能会有心理压力,我感觉使用起来有一点心理压力,时间一秒一秒的过,不过设定的时间长了,其实根本没什么大不了的。
最终代码——放弃alt+tab的线路,只使用#tab
~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { send #{tab} return
当鼠标在左上角的并且鼠标滚轮向下的时候,触发。
不足——考虑到使用#tab每次动画效果影响观感,而且也不想舍弃旧代码,所以还是贴出来吧,各有好处说不定。
——区别——
前者使用了alt+tab的方法,如果激活热键,不选择窗口,点击空白区域,默认会切换到下一个应用,这点是alt+tab的特性决定的,只要使用了这个组合键,窗口选择必然下一个;后者使用#tab,虽然激活窗口选择后,点击空白区域不会进入下个应用,但是每次切换,都有长时间的动画切换特效,让我受不了。点击空白处表示取消操作的交互逻辑符合操作习惯,可是这个动画···而且我也不想去关闭系统动画,偶尔看看还行,不能常看啊。总之就是,两个方案都有不好的地方,而且我最需要的功能其实也没能完成,就是用鼠标滚轮在预览窗口来回切换,几次尝试未果,放弃。
——猜测——
窗口全部都在任务栏上,可以使用#+数字来激活窗口,是否能用鼠标滚轮控制变量的增减,配合滚轮热键来切换应用呢?
global f:=1 ~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { f++ Send,#%f% } Return
可以完成相关功能,但是数量很关键,如果数量一直递增,没意义,肯定要设置一个顶点,到了就重置。可是这个顶点怎么设置?如何才能判断我打开窗口的个数呢?
有WinGet这个指令貌似能帮上忙,但是能力不足,用不上这个。终究还是放弃了。
最终代码——设定了窗口数字为7,超过7之后的窗口,就不能起作用了。鼠标在特定位置上下滚动可以完成相关动作。
global f:=1 ~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { if f<7 { f++ Send,#%f% } Else { f:=1 Send,#%f% } } Return ~WheelUp:: MouseGetPos, x, y If (x<10)&&(y<10) { if f>1 { f-- Send,#%f% } Else { f:=7 Send,#%f% } } Return
缺点:窗口数量的设定要和实际窗口数量不能出入太大,不然影响使用效果。鼠标滚轮动一格,就生效一次,一个不小心可能切换太多应用,对于一部分人可能不好操控。如果鼠标滚轮有问题,不能一格一格的使用,那么在每一个send指令之后加上一条”sleep,300″,亲测效果好一点。
——————————
想知道alt+tab和#+数字两种方法哪一个更适合自己,所以打算将右上角也设定起功能。但是发现台式机屏幕和笔记本屏幕差距太大,利用像素点肯定是不行的。有没有想浏览器那样,可以获取屏幕大小的指令·····
——————
SysGet
获取屏幕分辨率、多显示器信息、系统对象的尺寸和其他系统属性。
从参考文档中发现了两个脚本内置变量,可以直接获取屏幕大小。
——————
最终代码——在使用表达式的时候,不需要%%,将判断语句改成这个就可以了,之后在屏幕上各种功能的设定,都只需要改动比例系数。
If (x<(A_ScreenWidth*0.005))&&(y<(A_ScreenHeight*0.005))——左上角
if((A_ScreenWidth*0.995)<x)&&(y<(A_ScreenHeight*0.005))——右上角
——————
功能完成,三种都用了一下,在正常情况下,发现#+tab脱颖而出,它的好处就是,在同一个位置再次触发滚轮热键,可以取消,相比之下alttab方案就不是很好用了,必须要用鼠标去点击,而且点击空白处会默认切换应用;在隐藏底部任务栏之后,如果要使用#+数字的方案,地步任务栏会再次出现,切换应用后隐藏,使用时出现,再隐藏,而且考虑到窗口数量的问题,最终还是使用右上角#tab的方案。
——————
CoordMode,mouse,screen让鼠标获取屏幕坐标,使用通用功能需要这个。
如果要在特定软件中的特定位置使用其它功能···想想都觉得快捷方式太多了···
——————
这个功能实现后,隐藏任务栏的影响也会降低很多。
————————
测试了一下使用循环来完成自动功能,代码如下
CoordMode,mouse,screen Loop { MouseGetPos, x, y If (x<10)&&(y<10) MsgBox,屏幕左上角 }
功能完成,当鼠标移动到最上角的时候,触发对话框。CPU占用13%,看看能不能优化。
加上一条sleep之后,CPU占用明显降低。
MouseGetPos, x, y sleep,30 If (x<10)&&(y<10)
CPU占用为0现在。
最终代码——绕了大圈子,完成一个类似的,倒是有不少意想不到的收获。
CoordMode,mouse,screen Loop { MouseGetPos, x, y sleep,30 if((A_ScreenWidth*0.995)<x)&&(y<(A_ScreenHeight*0.005)) { Send,#{tab} Sleep,1000 } }
————————
虽然功能简单,但是过程中又捞到了不少新的命令。
比如说ToolTip,虽然这会儿没用上。
————————
最终代码——找到解决方法了。
之前使用alt+tab的方法,因为不能再次发送alt+tab,所以滚轮选取窗口的功能流产了。也曾经尝试使用鼠标滚轮来发送tab,但是因为alt一直处于按下状态,如果热键使用!wheeldown之类的,就会产生一个情况,这个!会被触发,也就是alt已经被使用过了,按键已经up已经弹起了,选择窗口的界面就无法继续维持。解决代码如下。
~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { Send {Alt Down} Send {tab} KeyWait,lbutton,d t20 if errorlevel>0 ;超时为1,否则为0 { Send {esc} Send {alt up} } Else Send {alt up} Return *WheelUp::Send {tab} *WheelDown::Send,+{tab} } Return
这个*是通配符,之前没这个需求所以一直没关注,今天是因为要用keywait指令遇到麻烦,也算是碰巧吧,尝试了一下这个问题就解决了。
*X表示按住其它修饰键(!^+)的情况下,热键X依旧有效。这就牛逼了。
缺点,这个代码有bug,就是貌似已经默认鼠标滚轮上,发送tab,不论在什么位置。这就尴尬了。也就是说这个热键,可能是已经挂到进程里面去了,只要运行过一次,*wu和*wd就已经生效了,之后不论在哪里,只要顺利激活就可以了。也就是说,每次滚轮都会激活上或者下,又因为wheeldown已经设置为热键了,所以只要给wheelup设置一个热键就好,为了把干扰降到最低,直接复制一份代码出来改个热键就能用了。
解决办法简单粗暴,
~WheelDown:: MouseGetPos, x, y If (x<10)&&(y<10) { Send {Alt Down} Send {tab} KeyWait,lbutton,d t20 if errorlevel>0 ;超时为1,否则为0 { Send {esc} Send {alt up} } Else Send {alt up} Return *WheelUp::Send {tab} *WheelDown::Send,+{tab} } Return ~Wheelup:: MouseGetPos, x, y If (x<10)&&(y<10) { Send {Alt Down} Send {tab} KeyWait,lbutton,d t20 if errorlevel>0 ;超时为1,否则为0 { Send {esc} Send {alt up} } Else Send {alt up} Return } Return
————————
现在顺利了。缺点,丑。重大缺点,热键是滚轮,切换标签也是滚轮,在这里我使用了*WheelUp,如果我要使用ctrl+滚轮来调节别的东西,那么会激活热键,同时又激活*WheelUp,那么就得不到^+的功能,只能得到一堆tab,就目前来看,这个功能也不常用,所以决定把代码从常驻代码中移除,使用#d的方案。话说这个功能基本上就没用过···
————
完成功能比较兴奋,来回滚动鼠标,报错了。
这个应该和脚本没多大关系。
————————————————————————————
今天在文档里,发现了这么一段代码
MButton::AltTabMenu WheelDown::AltTab WheelUp::ShiftAltTab
这段代码出现在帮助文档入门前几页中,很好的解决了我的问题。
稍微修改一下就可以用了。
——————
这几个特殊指令必须和热键再同一行,所以暂时没找到利用的方法。