[基础] AHK函数对象系列-绑定函数对象v2
那篇文章讲的是“绑定函数对象”,一开始的示例是“HotKey”命令,所以前面都是围绕着这个命令来说的其实是通用的,示例3(v3)中展示了在其它地方的用法。
HotKey估计是最常用的几个AHK命令了,主要功能是在程序的运行过程中操作热键(关闭/开启等),比起静态的注册热键要灵活很多。其实HotKey的参数不一定是标签,也可以是没有参数的函数。但是如果给带有参数的函数注册热键,会出现错误"Target label does not exist"。其实这个需求可以用"绑定对象函数(BindFunctionObject)"来实现。
;# 错误案例展示,以下代码均不能运行
Hotkey,^l,SendAND
Hotkey,^l,SendAND("TheText")
SendAND(text){
SendByClip("SendANDRemove")
return
}
绑定函数对象介绍
"绑定函数对象(BindFunctionObject)"是"函数对象"(FunctionObject)的一种。
作为函数对象,它有以下特性,①可以使用%FunctionObject%(ParaMeters)的方法调用,②可以在很多原本只支持Label的地方使用(比如Menu/hotkey/GUI事件)
除了函数对象带来的便利,它的主要作用就是可以给参数固定具体的数值。
这两点结合就可以实现为在"在HotKey命令中给带有参数的函数注册热键"。
绑定函数对象的生成
对于可以获得引用的函数来说,直接用Func对象中的bind()方法即可。
示例1:用HotKey给带有参数的函数注册热键
^l:: ;#按下Ctrl+L触发程序
;#把一个Bind对象放入变量中
;## 首先我们使用"Func()函数"返回一个"Func函数对象",之后我们调用此对象内的"Bind()方法"返回一个"Bind函数对象"
P0:=Func("TestFunc").Bind("传参成功")
;#通过hotkey注册,实现传参
Hotkey,^p ,%P0%
;# 用于测试的函数
TestFunc(Param:="没有传参"){
MsgBox,% Param
return
}
return
示例2:函数的动态调用实现传参
程序设计目的: 按下某快捷键,调用" ExActivateAndOpen "函数,搜索标题中带有"- 笔记.itmz"窗口,如果存在则激活,如果不存在则调用"JumpAndSearch"函数,跳转到Everthing,并且填入内容(input提示输入,自动加入符合Everthing语法的前缀),以搜索带有"- 笔记.itmz"的文件。 BindFunctionObject在这个案例中的作用: 如果没有"绑定函数对象",那么只是用普通的"动态函数调用",不能传递参数,所以需要重新额外搞一个特殊"函数",而不能直接用"JumpAndSearch",降低了程序模块化程度/可读性/开发效率。
由于知乎的代码块无法自动换行,造成阅读的不便,贴上代码图片。(Lib太长了,放在后面的文字中)
但是最好的阅读方式是复制完整代码,放到您常用的编辑器中阅读。
示例2:代码图片
![](https://img.haomeiwen.com/i14875935/88939a5290fd367c.jpg)
示例3:一键为MarkDown编辑器插入图片
示例3_程序设计目标
在Windows资源管理器下选中所需图像文件,并按下快捷键(Ctrl+m),程序会自动生成MarkDown语句。回到编辑器时按下Shfit自动插入图像,如果十秒内没有按下,提示用户超时,然后把MarkDown语句放到剪切板,之后再按下Shift也不会有任何效果(防止误触发)。
示例3_代码示例
;# 功能介绍:在资源管理器中选中一个文件(图片),运行该函数
;# 为MarkDown插入图像
InsertImageForMarkDown(EnableCopy:=1){
if (EnableCopy){
;# 选中文件并且复制
try{
Src:=SuperCopy(,1)
}
catch{
TrayTip,%A_ScriptName% 提醒,复制失败,请重试
return
}
}
if (EnableCopy=0){
Src:=Clipboard2
}
;# 剔除无用部分,留下路径
Reg1=(Copied File - ).*( - )
Path:=RegExReplace(src,Reg1,"")
;# 生成MarkDown图像标记
Result=![](%Path%)
;# 制作绑定函数对象
TheFunc:=Func("SendANDRemove").Bind(Result)
;# 注册热键
Hotkey,Ctrl,% TheFunc
;# 打开热键(因为重复使用的时候,因为已经注册了,只是注册是不会有变化的,必须要打开)
Hotkey,Ctrl,% TheFunc,On
;# 等待10秒
KeyWait,Ctrl, D T10
if (ErrorLevel=1){
TrayTip,%A_ScriptName% 提醒,Ctrl热键已经超时,相关文本已经放入剪贴板
Sleep 100
;# 如果超时的话就关闭热键
Hotkey,Ctrl,,OFF
;# 把处理好的字符串放到剪贴板中
Clipboard:=Result
}
return
}
;# 发送并且移动到填写标题的地方
SendANDRemove(Result){
;## 发送文本
SendByClip(Result,"Home","R2",,"Home","0")
;## 关闭热键
Hotkey,Ctrl,,OFF
return
}
return
技术总结
AHK中最简陋的复用是"标签",由于不能传递参数,所以对不同的数据进行处理时,非常蹩脚;其次是"函数",在原来"标签"的基础上实现了"传参"和"返回值";然后是"对象",对象把"数据域/方法"封装在了一起。关于各种对象的应用是从11.20.00之后才开始完善的,到现在好像还在继续。
通过三者的递进关系,可以看出AHK变得越来越"面向对象",通过不断的改进,相信AHK在编写相对大型的项目时,会更加得心应手。
End
[实战案例-AB002-1] 用AHK实现双击按键触发功能
我是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 _
更多文章:
[专栏] AHK程序设计 - SegmentFault 思否(优先持续更新)
[AHK经验] 动态调用本地库lib,必须显式声明
[基础] AHK函数对象系列-绑定方法对象
[基础] [GIF动图] 绕过中文输入法发送文本的3种方法
问题解答:
[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释
版权声明:
该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:2531574300,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。
文章版本:
v2_11月20日 新增 实战案例-AB002-1
AHK版本:1.1.30.00
![](https://img.haomeiwen.com/i14875935/319e198e74b0496c.jpg)