介绍
安装流程
1. 软件下载连接:https://autohotkey.com/download/ahk-install.exe
需要选择UNICODE 或者ANSI 版本安装版本,如果想用中文就选择UNICODE,然后全部下一步即可安装完成。
2. 支持AutoHotkey语言的IDE
下载链接:SciTE4Auto热键 (autohotkey.com)
也可以选择不适用IDE,使用文本编译器就可以,比如记事本等。
使用IDE主要是为了可以实现语法高亮,自动缩进,还支持调试等一些功能,本人初学者,感觉使用IDE看的更清晰明白一些。
3. AHK官网学习文档Help:AutoHotkey 初学者向导 | AutoHotkey v1 (wyagd001.github.io)
也可以通过安装的软件,找到Help
环境搭建完成,如何创建一个脚本?
步骤:
1. 选择合适路径下,鼠标右键,选择新建,可以看到AutoHotkey Script,新建一个脚本文件并命名,但是文件后缀名.ahk不要更改!(如果没有看到,可能是因为软件安装错误,感觉概率很小)
2. 鼠标右键脚本文件,选择Edit Script,编辑脚本,弹出的可能是记事本,也可能是我们自己安装的IDE,如果想要在IDE中编辑,可以在IDE中打开脚本文件
代码:
^q::
run Notepad.exe
Return
; 分号为注释
;^q表示热键,其中^为ctrl
; run 是命令,第二行的意思是打开记事本
;Return 和编程语言一样,结束的意思,表示后边的代码不会执行到
3. 鼠标右键,选择run Script,或者IDE中有运行按钮,执行脚本,会在任务栏的托盘中看到脚本图标,不同图标显示不同的状态。
4. 按下热键,ctrl+q 就可以运行脚本,自动打开记事本了。
5. 见到的一个脚本实现了
我们可以找Help,这是该程序自带的说明里边很清晰,支持多种语言
热键和热字符串
上边的例子就是热键,是键盘上按钮的组合
而什么是热字符串呢?
就是一段字符串的缩写,热键可以做的事情,同样的热字符串也可以干
::asd::
MsgBox You typed "asd".
Return
该脚本在可以输入asd的位置,就可以弹出一个窗口,显示MsgBox后边的内容
可以实现每一个热键或者热字符串对应多行代码指令
^j::
MsgBox, Wow!
MsgBox, this is
Run, Notepad.exe
Return
# 键的符号
# : win
! : Alt
^ : Ctrl
+ : Shiet
& : 连接两个热键,可以为鼠标按键,将其合成一个自定义热键
窗口的热键和热字符串
有些场景,想要热键或者热字符串在某些指定的窗口进行禁用或者启用,就需要下边的高级指令
#IfWinActive
#IfWinExist
需要提供指定窗体的句柄
; 无标题 - 记事本
#IfWinActive Untitled - Notepad
!q::
MsgBox, You pressed Alt+Q in Notepad.
Return
; 任何不是无标题 - 记事本的窗口
#IfWinActive
!q::
MsgBox, You pressed Alt+Q in any window.
Return
上述代码就是在无标题记事本中和其他中运行不一样的脚本指令
一个文件中可以有任意多个热键或者热字符串
::asd::By the way ; 替换"asd"为"aaa sss ddd", 当你按下结束符的时候.
:*:asd::By the way ; 替换"asd"为"aaa sss ddd"而不需要按下结束符.
^q:: ; Ctrl+Q 热键.
Run, notepad.exe ; 当你按下Ctrl+Q, 将启动记事本.
Return ; 热键内容结束, 这之后的内容将不会触发.
^W:: ; Ctrl+W 热键
Send, {ctrl down}c{ctrl up} ; 复制选定的文本. 也可以使用 ^c, 但这种方法更加可靠.
SendInput, [b]{ctrl down}v{ctrl up}[/b] ; 粘贴所复制的文本, 并在文本前后加上加粗标签.
Return ; 热键内容结束, 这之后的内容将不会触发.
发送按键
通过上面的描述,相信可以想到可以发送字符串
此处介绍如何发送按键:
Send命令:
符号 | 描述 |
! | 发送 Alt 键. 例如, Send This is text!a 将发送按键序列 “This is text” 并接着按下 Alt+A. 注意: !A 在某些程序中产生的效果与 !a 不同. 这是因为 !A 表示按下 Alt+Shift+A 而 !a 表示按下 Alt+A. 如果不确定, 请使用小写字母. |
+ | 发送 Shift 键. 例如, Send +abC 会发送文本 “AbC”, 而 Send !+a 会按下 Alt+Shift+A. |
^ | 发送 Control(Ctrl) 键. 例如, Send ^!a 会按下 Ctrl+Alt+A, 而 Send ^{Home} 则发送 Ctrl+Home. 注意: ^A 在某些程序中产生的效果与 ^a 不同. 这是因为 ^A 表示按下 Ctrl+Shift+A 而 ^a 表示按下 Ctrl+A. 如果不确定, 请使用小写字母. |
# | 发送 Win 键(带有 Windows logo 的按键), 因此 Send #e 会在按住 Win 键时按下字母 “e”. |
使用Send命令时,不需要给普通字符,数字这些加上{}花括号,如果是特殊按键需要加{}花括号
同时,一个Send可以一次性发送多个字符,数字或者字符串,不需要每一个字符都写一个Send
想要按住或者搜开某个按键,再怎么描述
^j::
Send {Ctrl Down}a{ctrl up}
sleep 1000 ; 停留1秒
用花括号括起来,同时后边加上up和down
如何发送超长文本时保证代码整洁?
^j::
Send,
(
one
two
three
)
用小括号将发送的文本内容放在中间即可实现
Send命令还有很多种不同的形式,如果Send不能满足需求,可以去参考Help,还有 SendRaw, SendInput, SendPlay, SendEvent等其他发送明命令
打开网页或者程序
Run命令:
比如打开一个记事本,画图(mspaint.exe), 计算器(calc.exe),或者是一个文件夹,网址都可以使用Run实现
; 运行一个程序. 注意 大部分的程序可能需要完整路径.
Run, %A_ProgramFiles%\Some_Program\Program.exe
; 打开一个网址
Run, https://autohotkey.com
; 一些程序并不需要完整路径, 如 Windows 标准程序.
Run, notepad.exe
Run, msPaint.exe
; 使用 AHK 内置变量来打开"我的文档"
Run, %A_MyDocuments%
; 打开一些网页
Run, https://autohotkey.com
Run, http://www.google.com
命令和函数
AutoHotkey 有两个重要的工具供开发者使用: 命令和函数.
所有命令和内置函数的列表可以在这里找到.
命令
命令后面的参数不需要使用小括号(),而函数同其他编程语言一样,后边参数需要使用()
Command, 参数1, 参数2, 参数3
使用命令时,不能将几条命令放在同一行,也不能将一个命令作为另一个命令的参数,都是错误的
跟函数不同的是, 命令使用"传统语法". 也就是说: 当你使用参数时, 你需要在参数的前后加上 %, 比如 %variable%. 而文本和数字则不需要加双引号. This is some text. 另外, 与函数不同, 命令的参数不能进行运算.
如果确实想要在参数中进行运算, 可以使用单个 % 来强制定义一个表达式
函数
函数就和编程语言一样,函数名()
Function(参数1, 参数2, 参数3)
1. 函数可以使用运算
SubStr(33*22, 1, 5)
2. 参数前后不需要加%
SubStr(2, 1, 2)
3. 函数可以嵌套另一个函数
SubStr(A_AhkPath, AddStr(A_AhkPath, "AutoHotkey"))
4. 文本前后需要加双引号
SubStr("I'm scripting, awesome!", 16)
函数通常返回一个值,这是和命令不一样的,命令需要参数来保存结果,而函数不需要
将函数的值赋值给一个变量使用:=
Value := SubStr("I'm scripting, awesome!", 16)
这不是唯一的赋值方法,但是这是最常用的,如果想学其他的可以参考Help文档
代码块
相同的和编程语言类似,使用{}花括号,中间的代码就是代码块
代码块常用于if和loop中,如果不使用花括号,那么整块的代码只会执行一行
if (Value = 5)
{
MsgBox, Value equals %Value%!!
ExitApp
}
此代码如果Value等于5,代码块的左右行全部会执行
如果不使用花括号,不管value是否等于5,脚本都会终止
如果if的代码块只有一行,那么可以选择不写花括号,但是要进行相应的缩进
变量
变量是用来保存信息的,可以用于函数,数学表达式,和编程语言类似
给变量赋值方法有很多种:
1. Value = Text 最简单传统的方式,给文本进行赋值
2. Value = %Value% 将一个变量赋值给另一个变量
3. Value = %Value2% some text %Value3% 混合赋值
4. MyVar := "Text" 表达式赋值
5. Value := Value2 表达式变量赋值
6. Value := 1+2/3*4 - Sqrt(9) 表达式数字赋值
7. MyVar := "The value of 5 + " MyVar2 " is: " 5 + MyVar2 表达式混合赋值
等号 (=) 和它前面的符号, 如 := += -= .= 等等, 这些被称为赋值运算符, 并且总是需要一个表达式
什么使用使用%百分号
什么时候要使用百分号:
1. 使用命令时,参数的输出变量或者输入变量时除外
2. 使用 = 给一个变量进行赋值的时候
什么时候不要使用百分号:
1. 参数中的输入输出变量,例如:StringLen, OutputVar, InputVar
2. 赋值时 = 左边的变量
3. 在传统 If 语句(不包括表达式) 中, 中左边的变量: If Var1 < %Var2%
4. 在表达式中
If (Var1 != Var2)
Var1 := Var2 + 100
获取用户的输入
cin,scanf都是C++中的输入语句,在这里同样也有输入
InputBox命令
InputBox, OutputVar, Question 1, What is your first name?
if (OutputVar="Bill")
MsgBox, That's an awesome name`, %OutputVar%.
InputBox, OutputVar2, Question 2, Do you like AutoHotkey?
if (OutputVar2 = "yes")
MsgBox, Thank you for answering %OutputVar2%`, %OutputVar%! We will become great friends.
else
MsgBox, %OutputVar%`, That makes me sad.
实例:
MsgBox, 4,, Would you like to continue?
IfMsgBox, No
return ; 如果选择 No, 脚本将会终止.
MsgBox You pressed YES. ; 否则, 用户选择了YES.
; 下面的例子展示了什么时候该使用百分号, 什么时候不该.
Var = Text ; 赋值一些文本给一个变量(传统的).
Number := 6 ; 赋值一个数字给一个变量(表达式).
Var2 = %Var% ; 赋值一个变量给另一个(传统的).
Var3 := Var ; 赋值一个变量给另一个(表达式).
Var4 .= Var ; 追加一个变量到另一个的末尾(表达式).
Var5 += Number ; 将变量的值与另一个相加(表达式).
Var5 -= Number ; 将变量的值减去另一个(表达式).
Var6 := SubStr(Var, 2, 2) ; 变量在函数中. 这总是一个表达式.
Var7 = %Var% Text ; 赋值一个变量给另一个变量并带有一些额外的文本(传统的).
Var8 := Var " Text" ; 赋值一个变量给另一个变量并带有一些额外的文本(表达式).
MsgBox, %Var% ; 变量在命令中.
StringSplit, Var, Var, x ; 在命令中的变量, 但是它们作为输入或输出变量.
if (Number = 6) ; 只要 IF 有括号, 它就是一个表达式, 所以不需要百分号.
if (Var != Number) ; 只要 IF 有括号, 它就是一个表达式, 所以不需要百分号.
if Number = 6 ; 如果没有括号, 那么 IF 是传统的. 不过, 只有赋值语句"右边"的变量需要百分号.
if Var1 < %Var2% ; 如果没有括号, 那么 IF 是传统的. 不过, 只有赋值语句"右边"的变量需要百分号.
对象
对象基本上就是变量的集合,变量的名称叫做键,变量的内容叫做值
所有的数组都是对象
我们调用对象的不同东西取决于我们使用他们的目的,但是所有对像都是相同的
对象是 数组 或 索引数组时, 这个对象的键是从 1 开始递增的连续数字
对象是 关联数组, 这个对象的键要么使用字符串(或文本), 要么使用不连续的数字. 有时可能是两者的混合, 也有可能是数列!
对象的键和值没有任何限制,甚至可以是另一个数组,我们把它叫做 嵌套数组
您可能想要使用对象的原因有很多, 一些例子:
- 当你需要描述一组有序列表时, 比如杂货店列表(这种情况最好使用索引数组)
- 当你需要描述一个图形方格时, 比如一个棋盘游戏(这种情况最好使用嵌套对象)
- 当你需要描述一组事物而每样事物都有自己的名称时, 比如描述水果的特性(这种情况最好使用关联数组)
创建对象
创建对象的方法同样也有很多:
1. [ ]中括号法:
MyObject := ["aaa","bbb","ccc",1,2,3]
索引数组,索引值从1开始,不同于数据结构中数组,3对应的索引值为:6
2. { }大括号法:
Banana := {“Color”: “Yellow”, “Taste”: “Delicious”, “Price”: 3}
关联数组,是数据的集合,键值对形式,其中每个条目都有自己的名称. 在这个例子中, 值 “Yellow” 存储在对象键 “Color” 中. 同样的, 值 3 存储在对象键 “Price” 中
3. 数组函数
MyObject := Array(“one”, “two”, “three”, 17)
和中括号方法一样,区别就是采用了函数的形式
4. 对象函数
Banana := Object(“Color”, “Yellow”, “Taste”, “Delicious”, “Price”, 3)
和大括号方法一样,区别就是采用了函数的形式
以上的所有方法的目的都是创建了对象,区别就是对象的键不同,仅此而已
使用对象
对象的使用有很多方式,比如:根据索引搜索值,设置修改值,添加值等
设置值
1. 方括号表示法:
Banana[“Pickled”] := True
和变量一样,放在 := 的左边即可
2. 句号表示法:
Banana.Consistency := “Mushy”
和上面一样, 但是用点(.) 符号.
检索值
1. 方括号表示法:
Value := Banana[“Color”]
使用表达式作为键从对象中获取值
2. 句号表示法:
Value := Banana.Color
仅允许使用原样的字串作为键名. 在句点表示法中键名不能使用变量
增加新的键和值
1. 方括号表示法:
MyObject[“NewerKey”] := 3.1415
只需设置一个不存在的键即可.
2. 句点表示法:
MyObject.NewKey := “Shiny”
和上面一样, 但是用点符号
3. InsertAt(在…插入) 法:
MyObject.InsertAt(Index, Value1, Value2, Value3…)
Index(索引) 为任意整数键. 这会将所有更高的整数键的索引向上移动插入值的数量, 即使是空缺的也一样(例如, 假设只有键 1 和 100 存在, 当插入一个值到第 50 个键的位置时, 将导致原来位于 100 的键的索引变成 101).
简单说就是数组的后半部分地址都要后移
4. Push(推送) 法:
MyObject.Push(Value1, Value2, Value3…)
“追加” 值到数组 MyObject 的尾部. 换句话说, 它将插入的值放在 最高整数键 + 1 的位置.
移除键和值
1. 用空白填充值
Banana.Consistency := ""
“”表示空字符串,在这里表示空值,这样不会删除键,可以通过HaKey方法得治知键依然存在
而且键也会出现在for循环中
2. 删除法:
RemovedValue := MyObject.Delete(AnyKey)
这和接下来的方法将删除键 和 值.
MyObject[AnyKey] 先前的值将存储在 RemovedValue 中.
NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey)
允许你删除 FirstKey 和 LastKey 之间的一系列的编号/整数或字符串键. 它给出的值将是被删除的键的数量, 如果你的键之间有间隙, 这是有用的(例如你指定键从 1 到 4, 但是键 2 不存在, 这将设置 NumberOfRemovedKeys 为 3, 因为只有三个键被移除).
3. Pop(抛出) 法:
MyObject.Pop()
这将删除最高的整数键, 并返回这个键对应的值. 而且这种形式不会影响其它键的索引顺序(因为没有比它更高的序列了).
4. RemoveAt(在…删除) 方法
RemovedValue := MyObject.RemoveAt(Index)
NumberOfRemovedKeys := MyObject.RemoveAt(Index, Length)
这将移除从 Index 到 Index + Length - 1(包含) 之间的所有键(例如 Index 为 5, Length 为 3, 则将删除键 5, 6, 7 这三个键). 如果 Length 省略则默认为 1. 移除这些键之后, 更高数字或整数的键将向下填充空缺, 所以如果有个值位于 Index + Length 那么它现在的位置就是 Index. 这很像 InsertAt 方法操作多个指定值的操作.
查看AHK版本:
MsgBox, %A_AhkVersion%