关于“利用鼠标切换软件窗口功能”的一点笔记

最终我发现我并不需要这个功能··· 只需要看“最终代码”部分即可。如果有需要,粘贴代码之后,务必使用编辑器的格式化代码功能。
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

这段代码出现在帮助文档入门前几页中,很好的解决了我的问题。

稍微修改一下就可以用了。

——————

这几个特殊指令必须和热键再同一行,所以暂时没找到利用的方法。

关于“利用鼠标切换软件窗口功能”的一点笔记

给TA捐赠
共{{data.count}}人
人已捐赠
其他教程

关于“keywait按键等待”的一点想法

2016-11-21 1:10:46

其他教程

[教程]关于“上一次使用的热键”相关内容

2016-11-21 1:47:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索