AutoHotkey

0x00 什么是AutoHotkey

AutoHotkey (以下简称为AHK)能够运行自定义的脚本来实现自动化操作,比如打开特定路径下的文件(如果文件路径很长或者经常变化),处理大量但是相同的操作等繁琐的工作等,都可以简化为一个回车的操作。其功能类似于IOS平台上的 WorkFlow

下载安装完以后会自带详细的英文版文档说明,不过官网上有亲民的中文版文档~

AHK脚本的后缀名为 .ahk,比如 Hello.ahk。打开创建的脚本文件编写代码即可。对于编写脚本语言,合适的编辑器不可少,这里我找到以下这些:

  • SciTE4AutoHotkey
  • Notepad++(在语言中选择Autolt可以高亮语法)
  • 当然在 VScode 里肯定也少不了对应的插件

0x01 AHK的基本语法

变量和表达式

一开始没有仔细看文档说明,上来直接使用常规语言的赋值方法,结果发现AHK的思路好反人类。在AHK中,变量的赋值和获取方式有两种 传统方法 和 __表达式方法__(推荐后者)。

__传统方法__(=)

这种方法赋值似乎会默认为字符串赋值,比如

1
2
3
4
5
a = 100     ; 字符串类型的 100
b = 一百 ; 字符串无疑

c = %a% ; 传统方法需要用%%提取变量中的值
MsgBox The value of c is %c% .

用惯了C++、Python等类型分明的语言,一接触传统方法一定会抓狂。所以推荐 表达式方法

__表达式方法__(:=)

赋值的语法和其他语言相同,不过就是在 = 前面多了一个 :

这样,就可以将一个数字方便地赋值给一个变量啦

1
2
3
4
5
a := 100    ; 数字 100
b := 一百 ; 字符串无疑

c := a ; 表达式方法直接复制即可。原因是变量在表达式中
MsgBox % "The value of c is " . c ; 使用类似与Python中的 `.join` 连接字符串

对于百分号的使用,文档中有一句话

注意: 变量名并非 总是 用百分号括起来; 百分号只在变量名和不加引号的文字一起时才需要. 除了创建 动态变量引用动态函数调用 之外, 不应在其他任何地方使用百分号.

内置变量

和PHP一样,AHK有很多的变量可以方便的获取很多信息,比如时间日期、脚本自身的属性。过多不贴

Send 发送键

Send键可以做很多事,比如发送一些按键到一个程序中,来模拟打字或按键操作。主要有这四种方法

  • 原始模式 使用 SendRaw 或者 {raw}。如 SendRaw, ^g 发送的就是 ^g
  • 文本模式{} 包含需要发送的内容,防止 ^+!#{} 等热键的触发,类似于 __原始模式__。
  • 普通模式 可发送按键,^+!#{}具有特殊含义。如发送 Alt 键可使用 Send ! 或者 Send {Alt}。符号表见 __0x02__。
  • 盲从模式 不知道咋用(怂)。

常用的 Send 普通模式下的命令参数

命令 描述
{Browser_Back} 按下浏览器的”后退”按钮
{Browser_Forward} 按下浏览器的”前进”按钮
{Browser_Refresh} 按下浏览器的”刷新”按钮
{Browser_Stop} 按下浏览器的”停止”按钮
{Browser_Search} 按下浏览器的”搜索”按钮
{Browser_Favorites} 按下浏览器的”收藏”按钮
{Browser_Home} 启动浏览器并打开主页
{Volume_Mute} 主音量静音/取消静音. 通常相当于 SoundSet, +1, , mute.
{Volume_Down} 减小主音量. 通常相当于 SoundSet -5.
{Volume_Up} 增加主音量. 通常相当于 SoundSet +5.
{Media_Next} 在媒体播放器中播放下一曲目
{Media_Prev} 在媒体播放器中播放前一曲目
{Media_Stop} 停止媒体播放器
{Media_Play_Pause} 播放/暂停媒体播放器
{Launch_Mail} 启动电子邮件程序
{Launch_Media} 启动媒体播放器
{Launch_App1} 启动用户程序 1
{Launch_App2} 启动用户程序 2
{PrintScreen} Print Screen
{CtrlBreak} Ctrl+break
{Pause} Pause
{Click} 鼠标右击

0x02 热键表

常用符号键

符号 描述
# Win(Windows 徽标键)
! Alt
+ Shift
^ Ctrl
* 通配符
Tab Tab键
$ 表示使用钩子创建这个热键,这样避免了循环激发。如果使用 a::a 将会无穷递归!
~ 激发热键时, 不会屏蔽(被操作系统隐藏) 热键中按键原有的功能
& 用于连接两个按键,合并成一个自定义热键
Space 空格键
CapsLock 大小写锁定键
Enter (或 Return) 回车键
Escape (或 Esc) 退出键
Numpad0等 NumLock关闭下数字小键盘
NumpadIns等 NumLock打开下的数字小键盘

光标控制

符号 描述 符号 描述
Backspace (或 BS) 退格键 Delete(或 Del) 删除键
Home Home键 End End键
PgUp 向上翻页键 PgDn 向下翻页键
Up 向上方向键 Down 向下方向键
Left 向左方向键 Right 向右方向键

鼠标部分

符号 描述
LButton 鼠标左键
RButton 鼠标右键
MButton 鼠标中键或滚轮
WheelDown 向下转动鼠标滚轮
WheelUp 向上转动鼠标滚轮

#IfWin热键

根据所处的窗口以及活动的情况,执行不同的操作。

  • #IfWinActive
  • #IfWinExist
  • #IfWinNotActive
  • #IfWinNotExist

基本格式为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#IfWinActive WinTitle, WinText
; WinTitle : 窗口标题或识别目标窗口的其他条件
; WinText : 目标窗口中单个文本元素的子字符串

; 比如:
#IfWinActive, ahk_class Notepad
^a::MsgBox 你在记事本中按下了 Ctrl-A . 而在其他窗口中按下 Ctrl-A 将原样发送.
#c::MsgBox 你在记事本中按下了 Win-C 组合键.

#IfWinActive
#c::MsgBox 你在非记事本程序中按下了 Win-C .

#If MouseIsOver("ahk_class Shell_TrayWnd")
; 在任务栏上滚动滚轮:增加/减小音量.
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}

有时候会需要多个热键对应一种功能,这个时候可以用过个热键叠放来处理

1
2
3
4
^Numpad0::
^Numpad1::
MsgBox Ctrl + Numpad0, Ctrl+Numpad1 can do the same thing.
Return

更多的热键参考:热键(鼠标, 操纵杆和键盘快捷键)


0x03 其他

其实毕竟是一种新的脚本语言,学习和记忆相关的用法比较枯燥,所以边实践边学习是最简单且高效的学习过程。
其实这一篇blog也不过是些十分零散的知识点,网络上学习AHK的教程千千万。这里强烈推荐

AHK实现了重复过程的简化,也能用少量的按键实现复杂的操作,下面是我想到的部分功能

  • 快速打开某些常用网站 baidu,google等
  • 快速打开常用应用
  • QQ的表情包限制太多,比如大小,尺寸……那么将表情包保存到本地,然后使用热键 + __send__ 表情包:D,斗图更方便。
  • 听说不少游戏需要同时按多个键来放大招……AHK岂不是开挂般存在。

不知道如此强大的AHK,被漏洞利用了会发生什么大新闻


如果你有啥想法,可以在评论区留言哦 (o゚v゚)ノ