AutoHotkey应用

本文最后更新于:2020年8月25日 上午

概览:自用脚本分享以及明日方舟简单脚本。

语法参考这篇文章 AutoHotkey入门 ~ Windows下自动化脚本


我的常用脚本(慢慢更新)

说明:部分脚本源自https://zhuanlan.zhihu.com/p/103357456

1.脚本暂停/继续

暂停脚本,ctrl+esc,再按一次可继续脚本。

1
2
3
^Esc::
Pause
return

2.获取选中文件的路径

用win+alt+c得到当前选中文件的路径

1
2
3
4
5
6
7
8
#!c:: 
send ^c
sleep,200
clipboard=%clipboard% ;windows 复制的时候,剪贴板保存的是“路径”。只是路径不是字符串,只要转换成字符串就可以粘贴出来了
tooltip,%clipboard% ;提示文本
sleep,500
tooltip,
return

3.窗口置顶(愿称之为最强)

脚本源自上面的那个知乎链接

在当前窗口下,win+alt+enter,来置顶窗口,即保持窗口永远在最上方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!enter:: ;窗口置顶
WinGet ow, id, A
WinTopToggle(ow)
return
WinTopToggle(w) {

WinGetTitle, oTitle, ahk_id %w%
Winset, AlwaysOnTop, Toggle, ahk_id %w%
WinGet, ExStyle, ExStyle, ahk_id %w%
if (ExStyle & 0x8) ; 0x8 为 WS_EX_TOPMOST.在WinGet的帮助中
oTop = 置顶
else
oTop = 取消置顶
tooltip %oTitle% %oTop%
SetTimer, RemoveToolTip, 5000
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
}

4.重大考试倒计时

用来显示距离一个重大考试还剩多长时间。win+alt+space

1
2
3
4
5
6
7
8
9
#!space:: ;倒计时

var1 = 20210120080000 ;考试的时间,年月日时分秒
var2 := %A_Now% ;获取系统的规格时间

Envsub, var1,%var2%,days ;按照day的形式相减,时间存储到var1
MsgBox,4,倒计时,距离考试还有%var1%天,加油ᕦ(ò_ó)ᕤ

return

5.秒表倒计时

也源自知乎链接

win+shift+t,输入多少秒,倒计时后弹窗。

1
2
3
4
5
6
#+t:: ;计时器
InputBox, time, 计时器, 请输入一个时间(单位是秒)
time := time*1000
Sleep,%time%
msgbox 时间到,ᕦ(ò_ó)ᕤ
return

明日方舟极简脚本

脚本作用于:Win10下的MuMu模拟器

脚本功能:对于指定的关卡刷指定数量的次数。不过刷关卡期间,不能使用电脑做其他事情……。

脚本分析

等待用户的唤起。唤起之后接收用户的输入数据,对用户选定的关卡进行点击操作,通过预先的坐标,隔一定的时长进行点击即可。当刷完之后,弹出弹框告诉用户结束。

主要问题在于获取固定的坐标方标软件点击。

使用Window Spy来获取软件内部坐标

Window Spy: 一个软件,用于查看有关鼠标悬停在其上的窗口的信息。

找到Window Spy的两种方式:

第一种,点击开始按钮,找到AutoHotkey的位置,点击spy即可。

第二种,运行一个脚本,脚本里最好有能运行的语句。运行之后,右键点击状态栏的图标也能找到Window Spy

当运行这个软件之后,他就会默认在窗口的最前方,当你的鼠标点击其他软件时,Spy会自动检测识别出,并显示鼠标当前位置、该点的颜色等各种信息。

上图中主要用到的信息一个是当前窗口的标题:明日方舟 - MuMu模拟器

另一个就是鼠标所在的位置信息,因为截图的缘故,没看到我的鼠标……

WindowClient所指的信息是当前鼠标相对于当前这个软件最左上角的坐标位置。而Screen是指的当前鼠标位于整个电脑屏幕左上角的坐标位置。

windows软件一般默认以左上角为原点,水平向右为x轴递增方向。铅直向下为y轴递增方向。

获取到软件以及软件内部的坐标,我们就可以通过模拟鼠标点击来实现脚本自动化执行。

普通关卡实例

普通关卡的刷材料步骤就是:(默认已经选中这一关的条件下)

  1. 点击开始行动,进入到人员配置界面
  2. 在人员配置界面点击开始行动。开始刷关卡。
  3. 等待关卡刷完之后,点击屏幕,返回到关卡入口处。

上图就是默认选中关卡的状态,记得要有体力,以及确保勾选了代理指挥

然后在这个界面执行脚本,就可以自动刷材料了。

以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
;快捷键为 ctrl + alt + m
^!m::
IfWinActive 明日方舟 - MuMu模拟器
{
CoordMode ,mouse,Window

InputBox, time, 计数, 请输入体力值以及单刷消耗值,使用小数点分隔

TimeArray := StrSplit(time, ".")

a := TimeArray[1] ;数组是从1开始
b := TimeArray[2]

times := a/b


times := Floor(times) ;Floor向下取整

alltime := times*3.1

MsgBox,一共要进行%times%次,需要时间为%alltime%。

loop %times%
{
Sleep 1000
send {click 1223,781} ;步骤1的坐标
Sleep 3000
send {click 1246,591} ;步骤2的坐标
Sleep 180000 ;等待3分钟
send {click 790,284} ;步骤3的坐标
Sleep 3000
}
MsgBox 代理完成。
}
return

使用

将上述脚本写入到你新建的脚本中。然后记得修改上面的坐标为自己电脑上的坐标,可能不一样,拿Spy检测以下位置,修改数值就可以了。

而第三步骤刷完关卡时,只要点击材料上方的任何位置都能退出去,所以这个坐标可以随意设置,只要注意规则就行了。上面两个坐标要严格按照spy的值来设置。

至于Sleep 180000表示等待3分钟,即关卡的代理时间,一般没有超过3分钟的关卡吧~(或许),自己动态调整,这里的单位时毫秒,1秒 = 1000ms。

选好你要刷的关卡,然后运行脚本,要以管理员的身份运行!!!这一点很重要,具体原因是:

当活动窗口以管理权限运行而当前脚本不是时, Send 在 Windows Vista 或更高版本中可能没有效果. 这是由于用户接口和特权分离的安全机制.

而MUMU模拟器是以管理员身份运行的!

来自参考文档:http://ahkcn.sourceforge.net/docs/commands/Send.htm#SendPlay

在软件中同时按下CtrlAlt以及m键,将会弹出上图的弹框,输入你当前的体力值以及单刷的消耗值,使用小数点隔离开来,点击OK就会自动计算需要时间,之后就会自动开始刷了。

剿灭关卡的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
^!q::
;剿灭作战 15分中

IfWinActive 明日方舟 - MuMu模拟器
{
CoordMode ,mouse,Window

InputBox, time, 剿灭, 请输入体力值以及单刷消耗值,使用小数点分隔

TimeArray := StrSplit(time, ".")

a := TimeArray[1] ;数组是从1开始
b := TimeArray[2]

times := a/b


times := Floor(times) ;Floor向下取整

alltime := times*16

MsgBox,一共要进行%times%次,需要时间为%alltime%。

loop %times%
{
Sleep 1000
send {click 1223,781}
Sleep 3000
send {click 1246,591}
Sleep 930000
send {click 790,284}
Sleep 10000
send {click 790,284}
Sleep 10000
}
MsgBox 代理完成。
}
return

适用于第三张剿灭图。刷一次大概要15分钟,这么看这个游戏好浪费时间。

大致操作和上面的普通关卡类似,预先选定好关卡,执行脚本就行了。

上述的坐标就用上面介绍的方法修改。

最后的说明

简单来讲这个脚本功能很弱,只能刷固定的关卡,还需要用户计算好关卡的时间。

没有任何检错机制,没有任何应对非常规问题的能力。比如如果网络不好,同步失败显示错误,它没法检测。例如代理失败等待用户确认,它没法检测。

原本想尝试做图片识别的方式来优化流程的,但是总是有离奇的错误,图片识别失败,最后放弃了。

简单来讲,勉强能用。

后续不会再更新这个脚本了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!