AutoHotkey入门 ~ Windows下自动化脚本

本文最后更新于:2020年8月4日 晚上

概览:自动化脚本AutoHotket语言相关基础知识。

关于AutoHotKey

Windows的终极自动化脚本语言。

官网: https://www.autohotkey.com/

使用AutoHotKey这个脚本语言可以很迅速方便的创建Windows下的便捷操作。例如一键打开多个网页,一键代替多个操作步骤。化繁为简,非常的方便好用。

安装

在上述官网下载当前版本Current Version下载,我当前使用的版本还是1.xx的。

下载后自行安装即可。

新建脚本与运行

鼠标右键 –> 新建,就能看到一个AutoHotkey script的选项,点击即可新建一个脚本。

对这个脚本右键选择用文本编辑器打开即可。

默认文件会有几行注释以及一些代码,没太搞懂啥意思,直接删掉脚本也能正常使用。

在其中填入要执行的脚本代码,例如下面的入门代码#space::Run www.baidu.com。保存文件之后,双击脚本或者右键选择Run Script,脚本就会被执行,如果你的脚本编写有语法错误的话,会直接弹出提醒。

脚本运行的话,你的状态栏那里就可以看到这个软件的图标。当你不需要运行这个脚本时,右键图标选择关闭退出即可。

除此之外还有脚本转.exe,自行探究~

入门学习相关资料

中文在线API: https://wyagd001.github.io/zh-cn/docs/AutoHotkey.htm

此外,安装软件之后也会自带帮助文件chm,与exe文件放在一起,可自行查看,不过那是英文版本。

除此之外,我还在知乎看到一位作者在分享他写好的一些脚本,涵盖面非常的广,链接:https://zhuanlan.zhihu.com/p/103357456

以下内容是我在接触脚本时做的一点笔记,不太完整,并且比较杂乱。主要参考了上面的中文在线API链接。


入门第一行

1
#space::Run www.baidu.com
  • 这行代码表示同时按下Win+空格,浏览器就会自动打开百度的网址。
  • #代表Windows键,space表示空格键,组合起来表示Win+空格。
  • ::双冒号表示,每次按下热键会执行其后面的操作。
  • Run命令后可以接程序、文档、URL或者快捷方式,这里后接网址会自动打开默认浏览器打开网址。
1
::btw::by the way
  • 上述这种叫做热字串,当输入btw后面跟着空格或者逗号时,会自动将btw替换为by the way。

其他符号

  • ^:表示Control
  • !:表示Alt键。
  • +:表示shift
1
2
3
4
5
;多行热键
#n::
Run www.baidu.com
Run Notepad.exe
return
  • RunWait:与Run类似,表示脚本等到程序或者文档结束之后才能执行热键

发送键击

send命令可以发送键击到活动窗口(最前面的窗口)中。

1
2
3
^!c::
Send 我爱你,{Enter}{Tab} 骗你的
return

这段命令是,向当前的文本编辑器中输入两句话,{Enter}表示模拟按下回车键,{Tab}表示模拟按下缩进键。

鼠标点击

发送鼠标点击到窗口。

使用Window Spy来获取目标窗口中的位置,相对当前窗口左上角的位置。

然后再Click x,y,模拟鼠标左击即可。

Click里不支持表达式,对于变量来说,变量要加百分号。

激活与操作窗口

激活窗口就是指使窗口位于最前边,可使用WinActivate

IfWinActive:检查指定的窗口是否活动,后接窗口标题。

IfWinNotActive

1
2
3
4
5
6
^!v::
IfWinActive 入门.md - Typora
{
MsgBox Active!
}
return

WinWaitActive:等待指定窗口变为活动窗口。

WinClose:关闭指定窗口

WinMove:改变指定窗口的位置和/或大小。

WinMinimize, WinMaximize, WinRestore 分别最小化, 最大化或还原指定窗口.

获取用户输入或者提示

MsgBox:用于显示提示框

InputBox:提示用户输入字符串。

1
2
3
4
5
MsgBox, 4, , Would you like to continue?
IfMsgBox, No
return
; 否则, 用户选择了是.
MsgBox You pressed YES.

变量

变量是脚本用来存储文本或数字的内存块. 只包含数字的变量 (可以含小数点) 在数学运算或比较时会被自动转换为数字.

除了函数中的局部变量外, 所有的变量都是全局的; 即可以在脚本的任意位置读取或改变它们的内容. 此外, 变量不需要声明; 简单地使用它们就可以让它们存在 (且每个变量都以空或空白开始).

1
2
3
4
5
6
7
8
9
10
11
12
^!b::
MyVar1 = 123
MyVar2 = my string
if MyVar2 = my string
{
MsgBox MyVar2 contains the string "my string".
}
if MyVar1 >= 100
{
MsgBox MyVar1 contains %MyVar1%, which is a number greater than or equal to 100.
}
return
  • %MyVar1%用百分号包含变量,用于显示变量的内容。
  • MyVarConcatenated = %MyVar1% %MyVar2%则字符串为123 my string

使用if来比较两个变量的内容。

1
2
3
4
if (ItemCount > ItemLimit)
{
MsgBox The value in ItemCount, which is %ItemCount%, is greater than %ItemLimit%.
}

注意上面例子的首行包含小括号. 小括号表示这个 if 语句包含表达式. 如果没有它们, 那行将被视为 “非表达式 if 语句”, 并且因此需要使用百分号括住 ItemLimit (这样的 if 语句被限制为只能包含简单的比较运算符, 而不能包含数学运算符或像 “AND” 和 “OR” 这样的联合运算符).

数学

赋值::=,冒号等号运算符

1
NetPrice := Price * (1 - Discount/100)

剪贴板

Clipboard 变量是特殊变量, 因为它包含了 Windows 剪贴板中当前的文本. 即使如此, 它的用法也和普通变量一样.

1
2
MsgBox %clipboard%
;显示剪切板的内容

替换剪切板内容

1
clipboard = A line of text.`r`nA second line of text.`r`n
  • ``r`加上n表示回车+换行。

追加剪切板内容,就像变量一样

1
clipboard = %clipboard% And here is the text to append.

循环

1
2
3
4
5
Loop 3;3表示循环次数
{
Run C:\Check Server Status.exe
Sleep 60000 ;暂停 60.
}

当一个或多个条件改变时循环还可以终止它自己. 下面的例子中当用户按住 F1 键时会重复点击鼠标左键:

1
2
3
4
5
6
7
8
9
$F1::  ;把F1键设置为热键($符号会有助于下面GetKeyState的"P"模式).
Loop ;由于没有指定数字,所以这是个无限循环,直到遇到内部的"break""return".
{
if not GetKeyState("F1", "P") ;如果此状态为true,那么用户实际已经释放了F1键.
break ;中断循环.
;否则 (由于上面没有"中断"),继续点击鼠标.
Click ;在当前指针位置点击鼠标左键.
}
return

while循环:

1
2
3
4
5
6
$F1::
while GetKeyState("F1","P") ;当F1键实际被按住时.
{
Click
}
return

操作文件

要添加文本到文件的末尾 (或创建新文件), 请使用 FileAppend, 如下面的例子所示. 注意它使用 `n (换行符) 来开始新的文本行:

1
FileAppend, A line of text to append.`n, C:\My Documents\My Text File.txt

要覆盖现有的文件, 请在 FileAppend 之前使用 FileDelete. 例如:

1
FileDelete, C:\My Documents\My Text File.txt

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
^w::
; 创建数组后, 初始为空:
Array := Object()

; 写入数据到数组:
Loop, Read, C:\Users\colou\Desktop\list.txt ; 此循环获取文件中的每行, 一次一行.
{
Array.Insert(A_LoopReadLine) ; 添加此行到数组中.
}

; 从数组中读取:
; Loop % Array.MaxIndex() ; 较传统的方式.
for index, element in Array ; 在大多数情况下建议使用的方式.
{
; 使用 "Loop", 索引必须是连续的数字, 从 1
; 数组中元素的个数 (或者必须在循环中进行计算).
; MsgBox % "Element number " . A_Index . " is " . Array[A_Index]

; 使用“for”,同时提供了索引(或“键”)及与它关联
; 的值,并且索引可以是您选择的*任何*值。
MsgBox % "Element number " . index . " is " . element
}
return

图片识别

1
2
3
4
5
6
7
^c::
ImageSearch, FoundA, FoundB, 0,0, A_ScreenWidth, A_ScreenHeight, C:\Users\colou\Desktop\end.png
if ErrorLevel = 0
Sleep 1500
Click %FoundA%,%FoundB%
MsgBox end.
return
  • 如果找到了图片,FoundA与FoundB用来存储坐标。
  • 0,0 表示起始的左上角的位置
  • A_ScreenWidth, A_ScreenHeight表示右下角的坐标
  • 最后一个参数是路径
  • 如果找到了图片,ErrorLevel就为0.

语法

  1. 命令和变量不区分大小写

  2. 命令中的第一个逗号可以省略,特殊请矿除外(首个参数为空,以:=或者=开始,或者命令单独处于延续片段的顶部)。

    1
    2
    MsgBox This is ok.
    MsgBox, This is ok too.

    时间

A_Now是当前系统时间