AutoHotkey v1 类的定义与部分使用技巧

本文所使用的 AHK 版本为 AutoHotKey v1 。

前言

本人想在 AHK 中使用面向对象的方式编写代码,但是发现在官方文档中仅有较少关于 class 的操作代码示例,所以根据自己这两天的代码编写过程,整理出常用的一些使用技巧供大家参考。


类的创建和使用

类的创建使用 class 关键字。可以显式定义构造方法以及析构方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; 类的创建
class A {
; 静态变量的创建
static var1 := Expression1
; 类字段的创建
var2 := Expression2

; 构造方法,可传入任意参数,也可不传入参数
__New(...) {
}

; 方法的创建
; 可传入任意参数,参数支持默认参数值
; 根据需要可不写 return
methodName(...) {
...
return ...
}

; 析构方法
__Delete() {
}
}

类的使用:

1
2
a := new A(...)   ; 类的实例化,根据构造方法传入对应的参数
a.methodName(...) ; 使用变量的方法

在类中创建热键并绑定类方法

使用面向对象的思想编写代码的话,我们或许需要在类中创建热键及其响应逻辑的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
; 自定义的一个方法,用于加载类中所有的热键
loadHotKey() {
; 创建响应方法的方法引用
varFunctionA := ObjBindMethod(this, "functionA")

; 创建 Alt + A 的热键以及绑定其响应方法
HotKey, !A, % varFunctionA, On
}

functionA() {
; 热键的响应逻辑
}
}

上述代码便在类中创建了一个使用类中方法作为响应逻辑的热键。其中:

  1. varFunctionA := ObjBindMethod(this, "functionA") 部分:
    1. "functionA" 中双引号必须保留,双引号中间内容为对应的方法名。
    2. varFunctionName 为自定义的变量名称,与第7行第3个参数相对应。
  2. HotKey, !A, % varFunctionA, On 部分:
    1. !A 为热键的内容,具体可以参考文档中 热键 部分内容。
    2. % varFunctionA 中百分号必须保留,后面的内容对应上面一行自定义的变量名。

热键的使用:

1
new A().loadHotKey()

通过对该类的实例化并调用实例化对象的 loadHotKey 方法即可。


在类中绘制 UI 并绑定类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class B {
; 自定义的一个方法,用于绘制 UI 以及绑定响应的方法
loadView() {
; 绘制了一个按钮
Gui, Add, Button, w200 h35 hwndHFuncB, This is a button.

; 创建了响应方法的方法引用
varFuncB := ObjBindMethod(this, "functionB")

; 通过 HWND 将按钮与方法绑定
GuiControl, +g, %HFuncB%, % varFuncB
}

functionB() {
; 按钮的响应逻辑
}
}
  1. Gui, Add, Button, w200 h35 hwndHFuncB, This is a button.hwndHFuncB 部分:
    1. 形式为 hwnd + 自定义变量名
    2. 自定义变量名与第9行中第3个参数相对应。
  2. varFuncB := ObjBindMethod(this, "functionB") 部分:
    1. varFuncB 为另一个自定义变量名,与第9行中第4个变量名相对应。
    2. "functionB" 中双引号必须保留,双引号中间内容为对应的方法名。
  3. GuiControl, +g, %HFuncB%, % varFuncB 中第3、4个参数分别为上述的两个自定义变量名。

代码示例

使用面向对象思想重构 通过 AutoHotKey 简化 Hexo 操作 | 洛语 の Blog (luoyu-ying.github.io) 中 Deploy 部分的操作。

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
; 加载类的 UI 以及热键
new Deploy().load()

; -------------------------

; 类的创建
class Deploy {

load() {
this.loadView()
this.loadHotKey()
}

; 本代码中 GAD -> generate and deploy

loadView() {
Gui, Add, Button, w200 h35 hwndHGAD, Generate && Deploy

varGAD := ObjBindMethod(this, "generateDeploy")

GuiControl, +g, %HGAD%, % varGAD
}

loadHotKey() {
varGAD := ObjBindMethod(this, "generateDeploy")

Hotkey, CapsLock & G, % varGAD, On
}

generateDeploy() {
Run, %comSpec% /c hexo g && hexo d, , Min
}

}

AutoHotkey v1 类的定义与部分使用技巧
https://luoyuy.top/posts/e17fd16bc395/
作者
LuoYu-Ying
发布于
2022年7月12日
许可协议