AHK程序设计

[基础] AHK函数对象系列-绑定函数对象v2

2018-11-14  本文已影响5人  d61f25068828

那篇文章讲的是“绑定函数对象”,一开始的示例是“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太长了,放在后面的文字中)

但是最好的阅读方式是复制完整代码,放到您常用的编辑器中阅读。

[基础] AHK函数对象初窥 示例2 完整代码

示例2:代码图片

img

示例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

心如止水
上一篇 下一篇

猜你喜欢

热点阅读