快速上手AutoHotkey自动化脚本语言

介绍

安装流程

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%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值