0%

比按键精灵更轻巧的工具——AutoHotkey

在「按键精灵2014」一再出现未响应并且闪退后,迫使自己去寻求一个简便易用的脚本工具,所幸并不难找,那就是 AutoHotkey,一个 Windows 平台上的自动化脚本软件。


快速入门

每个脚本都是需由程序(AutoHotkey.exe)执行的包含命令的纯文本。脚本中还可以包含 热键热字串 或者甚至完全由它们组成. 不过, 在不包含热键和热字串时, 脚本会在启动后从上往下按顺序执行其中的命令.

创建新脚本:

  1. 下载 并安装 AutoHotkey
  2. 在桌面或您选择的文件夹中右键点击空白处
  3. 在菜单中, 选择 新建-> AutoHotkey 脚本
  4. 输入文件名, 确保它以 .ahk 结尾. 例如:Test.ahk
  5. 右键点击此文件并选择 Edit Script
  6. 在新的空行中,输入下列内容:#space::Run www.google.com

在上面的语句行中, 首个字符 # 表示 Windows 键; 所以 #space 表示按住 Windows 键然后按下空格键来激活热键。双冒号 :: 表示每次按下此热键时会执行其后续命令,这里是转到 Google 网站。要试用此脚本, 请继续下列操作:

  1. 保存并关闭此文件.
  2. 双击此文件来运行. 在任务栏通知区域会出现新的图标.
  3. 按住 Windows 键并按下空格键,在默认浏览器中会打开网页
  4. 要退出或编辑此脚本, 则在任务栏通知区域的绿色 “H” 图标上点击右键

注意:

快捷键

快捷键能简便地触发动作。在下面的例子中,Win + N 被设置为启动记事本,Windows 键用符号 # 表示,它被称为修饰符:

1
2
3
#n::
Run Notepad
return

在最后一行中,return 用来结束此热键。不过,如果热键只需要执行单行语句,那么此行可以直接放在双冒号的右边。换句话说,return 可以省略:

1
#n::Run Notepad

要在热键中使用多个修饰键,那么需要把它们连续地列出来 (顺序无关紧要)。下面的例子中使用 ^!s 来表示 Ctrl + Alt + S

1
2
3
^!s::
Send Sincerely,{enter}John Smith ; 此行发送键击到活动窗口
return
修饰符 按键
# Windows 徽标键
! Alt 键
^ Ctrl 键
+ Shift 键
< 使用成对按键中左边的那个。例如 <!a 意为 Alt+ A,只是使用左边的 Alt 键才可以触发
> 使用成对按键中右边的那个

流程控制

标签

标签比较简单,用来标记一段代码的位置,以 return 结束。

1
2
3
4
5
6
7
8
Gosub, Test
Goto, Test
; 不再执行
MsgBox, End

Test:
MsgBox, Test
return

Test 就是一个标签。标签可以用 Gosub 调用,Gosub 执行完后会继续执行下一行。也可以用 Goto 调用,但 Goto 调用完就不会回来了。

除了使用 Gosub 或者 Goto 调用,标签还可以作为其他命令的参数,比如 Hotkey、SetTimer 等等。

标签里的代码默认是执行的。比如这样一个 AHK 文件。

1
2
3
4
5
MsgBox, Begin

Test:
MsgBox, Test
return

即使没有主动调用 Test 标签,Test 标签里的内容还是会被执行。

可以使用动态的标签名来调用标签:

1
2
3
4
5
6
7
labelName := "Test"

; IsLabel 函数用来判断标签是否存在
if (IsLabel(labelName))
{
Gosub, %labelName%
}

函数

函数也可以实现标签的功能,但更强大和灵活:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Test1()
Test2("test")

Test1()
{
MsgBox, Test1
}

; 函数支持参数和返回值
Test2(text)
{
MsgBox, % text
return true
}

函数的调用方式是函数名加小括号,如果需要传递参数,在括号里添加参数。和标签不一样,函数里的代码默认是不执行的。

可以使用动态的标签名来调用函数:

1
2
3
4
5
6
7
functionName := "Test"

; IsFunc 函数用来判断函数是否存在
if (IsFunc(functionName))
{
%functionName%()
}

函数里可以调用标签,标签里也可以调用函数。标签和函数可以重名。

函数里的标签

在函数里可以再定义标签:

1
2
3
4
5
6
7
8
9
Test()
{
Gosub, Test2
return

Test2:
MsgBox, Test2
return
}

代码中 Test2 是一个内部标签,只能在 Test 函数中访问。但不同函数中的内部标签也不能够重名,即所有的标签名必须是唯一的。

总结

总结下标签和函数的区别:

  1. 定义和调用的方式不同。
  2. 函数支持参数和返回值,标签不支持。
  3. 标签默认是执行的,函数默认不执行。
  4. 调用标签的开销比调用函数小,调用空函数的耗时比调用空标签多百分之几十。
  5. 函数中可以使用局部变量和静态变量,但标签中只能使用全局变量。
  6. 某些场景可能只允许用标签,但最新的 AHK 版本基本所有场景都可以用函数了(如果以后想起来有不可取代的场景再补充)。

那么是使用标签还是函数呢?
通常情况,使用函数就可以了。如果考虑到性能,在无需参数和返回值的情况可以用标签取代函数。除非一个函数被高频率地调用,否则优化的效果不大。

脚本示例

编写了多个 AHK 脚本,逐个启动/关闭嫌麻烦?正在全屏看视频,外卖到了想把声音从耳机切换到音箱上又不想打断观看体验?明日方舟 1-7 刷到精污,阿米娅我不想努力了怎么办?

为了解决以上问题,所以编写了 AHK 脚本启动管理器 OneStartUp,声音切换助手 SwitchAudio,明日方舟护肝助手 Arknights 这三个脚本。

AHK脚本启动管理器

AHK 脚本启动管理器 OneStartUp,用来控制所有脚本(包括 OneStartUp 自身)的运行/重启/退出。OneStartUp 需要以管理员权限运行才能关闭其他同样以管理员权限运行的脚本(如 Arknights),所以还可以对自己提权(即以管理员权限重新运行)。

快捷键

功能 快捷键
重启 OneStartUp Alt + R
以管理员权限运行 OneStartUp Alt + A
退出 OneStartUp Alt + Q
运行 Arknights Alt + F1
重启 Arknights Shift + F1
退出 Arknights Alt + Shift + F1
运行 SwitchAudio Alt + F2
重启 SwitchAudio Shift + F2
退出 SwitchAudio Alt + Shift + F2

脚本内容

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
; ////////////////////////////////////////////
; /////////////////AHK脚本列表/////////////////
; ////////////////////////////////////////////
; AHK脚本启动管理器(自身)
scriptTitle0:="OneStartUp.ahk - AutoHotkey"
scriptPath0:="D:\Software\links\OneStartUp.ahk"
; 明日方舟护肝助手
scriptTitle1:="Arknights.ahk - AutoHotkey"
scriptPath1:="D:\Software\links\AHK Scripts\Arknights.ahk"
; 音量切换助手
scriptTitle2:="SwitchAudio.ahk - AutoHotkey"
scriptPath2:="D:\Software\links\AHK Scripts\SwitchAudio.ahk"

; ////////////////////////////////////////////
; //////////////////脚本启动器/////////////////
; ////////////////////////////////////////////
; 重启
!+r::Reload
; 提权
!+a::runScript(scriptPath0,true)
; 退出
!+q::sendcmd("退出",scriptTitle0)

; ////////////////////////////////////////////
; //////////////明日方舟护肝助手///////////////
; ////////////////////////////////////////////
; 运行
!F1::runScript(scriptPath1,true)
; 重启
+F1::sendcmd("重启",scriptTitle1)
; 退出
!+F1::sendcmd("退出",scriptTitle1)

; ////////////////////////////////////////////
; ////////////////声音切换助手/////////////////
; ////////////////////////////////////////////
; 运行
!F2::runScript(scriptPath2, false)
; 重启
+F2::sendcmd("重启",scriptTitle2)
; 退出
!+F2::sendcmd("退出",scriptTitle2)

; ////////////////////////////////////////////
; ////////////////脚本状态管理/////////////////
; ////////////////////////////////////////////
sendcmd(cmd,scriptname)
{
; 允许控制隐藏窗口
DetectHiddenWindows, on
; 窗口标题的任意位置包含 WinTitle 才能匹配
SetTitleMatchMode,2
cmd_no:={重启:65303,编辑:65304,挂起:65305,暂停:65306,退出:65307}
PostMessage, 0x111,cmd_no[cmd],,,%scriptname%
return %cmd%
}

; ////////////////////////////////////////////
; ////////////////脚本启动管理/////////////////
; ////////////////////////////////////////////
runScript(scriptPath, isAdmin){
; 判断是否以管理员身份运行
if(isAdmin){
Run *RunAs %scriptPath%, SANNAHA, ysy,
}else{
Run %scriptPath%
}
}

音量切换助手

一键切换声音输出设备,免去手动调整的麻烦。

快捷键

功能 快捷键
切换声音输出设备 Alt + Home

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Home::switchAudio()
switchAudio(){
; 打开“声音”控制面板
Run c:\windows\system32\control.exe mmsys.cpl
; 等待“声音”控制面板打开,并置顶
WinWaitActive 声音
WinSet AlwaysOnTop, On, 声音
; 选中第一个播放设备
Send {DOWN}
; 获取“设为默认值”按钮(Button2)的启用状态,控件启用为 1, 控件禁用时为 0
ControlGet, MyState, Enabled, , Button2
; 如果控件启用(即“设为默认值”按钮启用,换句话说:当前播放设备未设为默认)
If (MyState = 1){
; 点击活动窗口(A)的“设为默认值”按钮
ControlClick, Button2, A
} Else {
; 否则选中下一个播放设备
Send, {DOWN}
ControlClick, Button2, A
}
WinClose, 声音
}

明日方舟护肝助手

需求其实很简单,《明日方舟》这款游戏公开测试将近一年了,仍有许多玩家的痛点尚未得到解决,比如任务、订单的一键收取功能仍未实装。作为一个模拟器玩家索性使用脚本去实现这些功能,避免枯燥的重复操作。

学习使用 AHK 的源动力就是为了改善《明日方舟》的游玩体验,现在官方已经优化了基建繁琐的“收菜”流程,上面一段话写在优化之前。

有了自动化脚本,搭配上向日葵或 TeamViewer 等远程控制软件,就可以随时随地用手机控制电脑刷 1-7 了,好耶!

快捷键

功能 快捷键
暂停脚本 Ctrl + Shift + P
重启脚本 Ctrl + Shift + R
输入密码 Ctrl + Shift + L
访问基建 + 清理基建和订单 Ctrl + Shift + F
清理基建和订单 Ctrl + B
回首页 Ctrl + Shift + H
领取任务 Ctrl + Shift + T
1-7 Ctrl + Shift + G
7-15 Ctrl + Shift + Q

脚本内容

个人使用的 AHK 脚本内容如下,每日首次登录后使用 Ctrl+F 处理积累的事务。其中,「访问基建」提供多访问 1 位的冗余,「基建」采用 2 贸易站的配置:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
; 暂停脚本
^+p::Pause
; 重新加载
^+r::Reload

; 输入密码
^+l::SendInput yourpassword

; 检测行动结束(未实装)
; 0xff9602:经验橙:250, 150
; 0x0098DC:任务蓝:300, 60
; ^+i::
; Color:=getColor(300, 60)
; MsgBox The color is %Color%.
; return

; 访问基建+清理基建和订单
^+b::
{
visitBase()
backHome()
cleanBase()
}
return

; 回首页
^+h::backHome()

; 领取任务
^+t::recieveTask()

; 1-7,6san,82000,固源岩,G
^+g::startAct(75500,88)

; 7-15,18san,140000,全新装置,Q
^+q::startAct(140000,6)

visitBase(){
IfWinExist 明日方舟 - MuMu模拟器
{
WinActivate
Send {F}
Sleep 1800
Send {L}
Sleep 2400
Send {V}
Sleep 4800
loop 10
{
Send {B}
Sleep 4800
}
}
}

; 清理基建和订单
cleanBase(){
IfWinExist 明日方舟 - MuMu模拟器
{
WinActivate
Send {B}
Sleep 3800
Send {N}
Sleep 1000
Send {R}
Sleep 1500
Send {R}
Sleep 1500
Send {R}
Sleep 1500
Send {R}
Sleep 1500
}
}

; 返回首页
backHome(){
IfWinExist 明日方舟 - MuMu模拟器
{
WinActivate
Send {H}
Sleep 1200
Send {L}
Sleep 2800
}
}

; 领取任务
recieveTask(){
IfWinExist 明日方舟 - MuMu模拟器
{
WinActivate
Send {T}
Sleep 1200
loop 28
{
Send {C}
Sleep 1200
}
Send {W}
loop 10
{
Send {C}
Sleep 1200
}
}
}

; 获取颜色
; 0xff9602:经验橙:250, 150
; 0x0098DC:任务蓝:300, 60
getColor(x, y) {
PixelGetColor, color, %x%,%y%, RGB
return color
}

; 开始行动
startAct(lasting, times){
Send {B}
Sleep 1800
Send {S}
Sleep % lasting
loop % times-1
{
IfWinExist 明日方舟 - MuMu模拟器
{
WinActivate
Sleep 300
Send {S}
Sleep 3800
Send {B}
Sleep 1800
Send {S}
Sleep % lasting
}
}
}

模拟器键位

模拟器分辨率更换为 1440x1080,以下内容待更新。

模拟器为 MuMu 模拟器,分辨率为 1440×720 ,「键鼠方案配置文件」放在下面以供下载,同时提供键位截图及说明:

点击下载
键位-首页
  • B:基建(Base)
  • F:好友(Friend)
键位-好友
  • L:好友列表(List)
  • V:访问基建(Visit)
  • B:访问下位(复用)
键位-基建
  • N:提醒(Notification)
  • R:可收取(Receive)
  • M:贸易站1(MàoYìZhàn)
键位-贸易站
  • O:收取订单(Order)
  • M:贸易站2(复用)
键位-导航
  • H:主页(Home)
  • L:首页(复用)

参考资料
指南(快速入门)
AHK 中标签和函数的用法

  • 本文作者: SANNAHA
  • 本文链接: https://sannaha.moe/AHK/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!