美文网首页AHK程序设计
[基础] AHK函数对象系列-绑定函数对象v2

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

作者: d61f25068828 | 来源:发表于2018-11-14 22:49 被阅读5次

那篇文章讲的是“绑定函数对象”,一开始的示例是“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

心如止水

相关文章

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

    那篇文章讲的是“绑定函数对象”,一开始的示例是“HotKey”命令,所以前面都是围绕着这个命令来说的其实是通用的,...

  • [基础] AHK函数对象系列-绑定方法对象v3

    文章编号-AHK-J003-绑定方法对象 缘由 希望用户在对象创建时就能够直接为成员方法绑定某键,如果这个功能不能...

  • [基础] AHK函数对象系列-对象属性与数据域保护v2

    AB009-[基础] AHK函数对象系列-对象属性与数据域保护 活见鬼:明明变量改了,为什么显示不出来? 在上文 ...

  • js-继承

    一、构造函数绑定使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行。Ani...

  • Function(){}.bind()

    bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入...

  • js 继承

    js继承有四种方式 1. 构造函数绑定 使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象...

  • js构造函数继承

    1.构造函数绑定 最简单,使用call和apply,将父对象的构造函数绑定到子对象身上 2.prototype模式...

  • 【javascript】引用类型-Function类型

    函数是对象,每个函数都是Function类型的实例,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。 ...

  • [JavaScript] (Day-09) - 方法

    在一个对象中绑定函数,称为这个对象的方法 定义 原始的对象表示 但是,如果我们给Person绑定一个函数,就可以做...

  • this

    this对象是在运行函数时基于函数的运行环境绑定的;全局环境中,this对象就是window,而当函数被作为某个对...

网友评论

    本文标题:[基础] AHK函数对象系列-绑定函数对象v2

    本文链接:https://www.haomeiwen.com/subject/vmgsfqtx.html