关于autohotkey:AHKAutoHotkey使用教程

AutoHotkey 的用处一键启动指定程序和软件自定义快捷短语从新映射键盘,鼠标,游戏杆的按扭发送预设指令自动化所有操作★应用办法注意事项: 间接启动编辑好的.ahk文件启动用 txt文本关上.ahk我的项目批改保留后须要,须要重启能力失效语法规定非凡按键代码:程序流程化 altctrlshiftwinspace!^+# 输写规定单行写法 #g:: run, chrome多行写法 #g:: run, chromereturn#h:: run, chrome.exereturn#c:: run,"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"一个AHK文件中定入多行命令,一条命令完结后,要用行首的return完结;正文因为脚本运行时会疏忽正文, 所以它们不会影响脚本性能或占用内存. 单行正文办法一 ;win+s 关上tc软件#s::run "E:\totalcmd\TOTALCMD64.EXE"办法二 #s::run "E:\totalcmd\TOTALCMD64.EXE" ;win+s 关上tc软件多行正文,留神不能写成一行的:/win+s 关上tc软件/ /*win+s 关上tc软件*/\#s::run "E:\totalcmd\TOTALCMD64.EXE"新建一个.ahk文件,用txt程序关上输出以下代码: 用法: !g::run, “C:\Program Files (x86)\Mozilla Firefox\firefox.exe” www.google.com.hk★根底实例1)一键启动启动程序/网址/文档;一键启动多个软件#n::run notepadrun calcreturn;一键关上网址!g:run, https://www.google.com.hkreturn;一键关上文件夹 !m:run, "G:\images\images"2)自定义快捷短语;自定义快捷短语 ::tcd::Total Comander;中文要用剪贴板的办法实现,并且编码要用utf-8,倡议记事本关上 ::ali::text = 阿里巴巴clipboard = %text%Send ^vreturn升级版autohotkey_L反对中文 (XP零碎下AHK_L发送中文,要敞开360的驱动防火墙!) 3)指定浏览器登陆网络账号run, "firefox.exe" http://mail.163.comsleep, 5000 ;保险起见,再等5秒(视网速)send, {Backspace 10}xxxx@163.com{tab} yyyy{enter} ;删除已保留的用户名,模仿键入用户名、明码、回车return 4)从新映射按键F6::^c F7::^x 阐明 :F6定义为ctrl+c复制,F7定义为ctrl+x粘贴。 ★综合实例只关上一个chrome#g::DetectHiddenWindows, OnSetTitleMatchMode, 2WinGet, winid, ID, Google Chrome;MsgBox,%winid%SetTitleMatchMode, 1If (winid) {WinWait, ahk_id %winid%WinShowWinActivateControlFocus, EditComponent2, AControlSetText, EditComponent2,, A}else{RunOrActivateProgram("C:\Users\default\AppData\Local\Google\Chrome\Application\chrome.exe --enable-benchmarking")}DetectHiddenWindows, Offreturn关上暗藏在托盘中的旺旺\#Q::DetectHiddenWindows, OnSetTitleMatchMode, 2WinGet, winid, ID, `阿`里`旺`旺;MsgBox,%winid%SetTitleMatchMode, 1If (winid) {WinWait, ahk_id %winid%WinShowWinActivateControlFocus, EditComponent2, AControlSetText, EditComponent2,, A}else{RunOrActivateProgram("D:\Program Files\AliWangWang\AliIM.exe")}DetectHiddenWindows, Offreturn一键登陆网站run, [http://mail.163.com](http://mail.163.com/)WinActivate, firefox ;避免窗口不激活winwait, 网易 ;期待网页加载胜利(至多title显示进去)sleep, 500 ;保险起见,再等0.5秒(视网速)send, xxx@163.com{tab} yyyy{enter} ;模仿键入用户名、明码、回车returnAhk做的一些利用MenuZ 智能菜单ViATc 仿Vim热键利用于Total Commander管理器上VimDesktop 把桌面程序变成Vim类热键GestrueZ 手势软件 ...

December 6, 2021 · 1 min · jiezi

Hide Desktop Icon[AutoHotKey]

Hide Desktop Icon[AutoHotKey]/* Library: * Hide Desktop Icon * Description: * Hide the desktop icon by double clicking the left mouse button * Warnning: * None. * Version: * v1.0.3 * Author: * 泠音 */#IfWinActive ahk_class WorkerW ahk_exe Explorer.EXE{ intInterval:=200 ~LButton::If(A_PriorHotkey<> “~LBUtton” or A_TimeSincePriorHotkey>intInterval){ KeyWait, LButton return } HideOrShowDesktopIcons() return}HideOrShowDesktopIcons(){ ControlGet, class, Hwnd,, SysListView321, ahk_class Progman If class = ControlGet, class, Hwnd,, SysListView321, ahk_class WorkerW If DllCall(“IsWindowVisible”, UInt,class) WinHide, ahk_id %class% Else WinShow, ahk_id %class%} ...

February 12, 2019 · 1 min · jiezi

Quick Switch Virtual Desktop[AutoHotkey]

Quick Switch Virtual Desktop[AutoHotkey]/* Library: * Quick Switch Virtual Desktop * Description: * 在屏幕四周,任务栏,桌面上使用鼠标滚轮来切换虚拟桌面。 * Warnning: * None. * Version: * v1.0.3 * Author: * 泠音 */#MaxHotkeysPerInterval 300WheelUp:: If (isHook()){ Send, {LWinDown}{CtrlDown}{Left Down}{LWinUp}{CtrlUp}{Left Up} }else{ MouseClick, WheelUp } returnWheelDown:: If (isHook()){ Send, {LWinDown}{CtrlDown}{Right Down}{LWinUp}{CtrlUp}{Right Up} }else{ MouseClick, WheelDown } returnisHook(){ CoordMode, Mouse,Screen MouseGetPos, X,Y,ID,CLASS ; t1 := A_ScreenWidth-X ; t2 := A_ScreenHeight-Y ; MsgBox X:%X% Y:%Y% dw:%t1% dh:%t2% W:%A_ScreenWidth% H:%A_ScreenHeight% return MouseIsOver(“ahk_class WorkerW”) or MouseIsOver(“ahk_class Shell_TrayWnd”) or X == 0 or Y == 0 or A_ScreenWidth-X<2 or A_ScreenHeight-Y<2}MouseIsOver(WinTitle) { MouseGetPos,,, Win return WinExist(WinTitle . " ahk_id " . Win)} ...

February 12, 2019 · 1 min · jiezi

[番外篇] AHK中的HotKey变体

AB014-[番外篇] AHK中的HotKey变体_代码讨论长岛的雪:如果两个语境约束之间冲突,那么该如何解决?心如止水:我也遇到过,印象中帮助中有说过,不记得了如果是我的话,我会在语境约束的表达式中,加入更多限定条件,虽然写起来繁琐,但是还是能用的虚荣:我一般是用 ~ + if else 进行判断思考1:HotKey 变体的覆盖规则到底是怎么样的?如果使用"语境约束",也就是#if,那么规则很简单全局热键优先级最低非全局热键,靠近脚本顶部优先级越高如果使用 HotKey 命令中的子命令全局热键优先级最低非全局热键,先执行的优先级高其实第二条,两者可以说是一回事,因为#if是在编译的时候就生效的,所以在脚本中出现的顺序也就是执行的顺序,所以第二条其实就是:先执行的优先级高.#ifWin 一般说明Hotkey:变体(副本) 热键思考2:语境约束的原理语境约束其实就是计算表达式,如果表达式正确,那么热键生效,反之则不生效.所以,其实 波浪号+if else 表达式 和语境约束,原理应该是类似的.区别应该只在于可读性在帮助文档中也找到了相关的说明,其实现方式就是在热键被按下之前,由 AHK脚本 进行表达式计算.不过,区别当然不是"仅在于"可读性,如果使用波浪线,那么原来就有的热键不会被覆盖.思考3:直觉和习惯在大多数情况下,语境约束的方法,都会有更好的可读性这样我们就能看清楚,在某一个条件下(比如在 SciTE 窗口存在的条件下),所有的热键是什么,有什么关联操作但是,万一出现了变体冲突的情况,调整起来会非常麻烦,写起来会非常繁琐一般是不会遇到这种情况的,因为官方把全局的优先级降到了最低但在使用 GetKeyState 的时候,就经常遇到我们希望 #if GetKeyState() 优先级最低,但我们习惯把简单的式子放在上面,所以就会出BUG.End心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 ^^GitHub欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。欢迎给 新生的 BeanLib 投稿,每一位贡献者的名字都将被铭记。更多文章:[专栏] AHK程序设计 - 简书(优先持续更新)[基础] [GIF动图] 绕过中文输入法发送文本的3种方法[基础] AHK函数对象系列-绑定函数对象v3[基础] AHK函数对象系列-绑定方法对象[基础] 在AHK中实现函数重载的效果[基础] AHK函数对象系列-对象属性与数据域保护v2问题解答:[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释版权声明:该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。文章版本:v1v2 : 波浪线和语境约束是不一样的,想错了,更正AHK版本:1.1.30.00

January 25, 2019 · 1 min · jiezi

[中级] Func() 和 ObjBindMethod() 的关系

AB013-[中级] Func() 和 ObjBindMethod() 的关系上一篇文章发出来之后,@zhanglei1371 问我 " Func 和 ObjBindMethod 的关系"。其实"只要是方法就用 ObjBindMethod ,只要是函数就用 Func",大多数时候都是没问题的。但是深究下去,他们之间是有区别的。这是个好问题,顺带我介绍一下 Class 的内容。Class 和 Object这个地方学过"面向对象"的,可以跳过,这是给没学过的说的。情景面向过程现在假设你要做一款儿童游戏,你需要模拟出很多小动物,比如狗/羊等等。你一开始可能这么搞。 DogSound:=“汪汪~~” DogName:=“狗” DogCalling(){ global MsgBox,% DogName “:” DogSound return } DogFuncObj:=Func(“DogCalling”) %DogFuncObj%()是,今天是没问题了,但是明天老板让你做一只羊,后天老板让你做一只猴子,一只兔子,一只考拉。所以你就复制/粘贴/复制/粘贴,这么一直不停的堆积代码的办法就叫做"面向过程"。面向对象由于你做的动物非常多,“动物"这种东西又很有相似性,还有一个办法就是,你先做一个"动物"模板,之后每增加一个新动物,你就往里面填东西就是了。这个办法更方便,更符合人类的认知规律。这个模板就叫做 Class ,翻译过来就是"类”,用现代汉语来说就是"种类"。现在我们定义一个Class。;示例1Class Animal{ ;Field Sound:=“UnKnowSound” Name:=“UnKnowName” __New(aName,aSound){ this.Name:=aName this.Sound:=aSound return this } Calling(){ MsgBox,% this.Name “:” this.Sound return }}你可以根据这个模板,批量的生成大量的动物,节省你很多的时间。但是你要明白的是,动物本身是一个抽象的概念,他只是一个"种类",并不是一个实体,而你要生成的狗就是一个实体,实体 的英文就是Object。这个Object常被翻译为"对象",这种编程的方法也叫做"面向对象的编程吧"。下面我们来生成一只狗和一只羊,他们都属于Object。TheDog:=new Animal(“Dog”,“汪汪~")TheSheep:=new Animal(“Sheep”,“咩咩~")现在我们让他们都叫叫,听听声。TheDog.Calling()TheSheep.Calling()Func 和 ObjBindMethod 的关系问题在于"面向对象"搞清楚这一点了之后,“Func 和 ObjBindMethod 的关系"其实就很容易理解了。比如,你想获取一个"狗叫"的函数对象,你可能要把它用在HotKey命令中。(当然,这种没参数的方法可能简单些,这里就当有参数。)如果你是面向过程,也就是定义的函数,那么你需要这么做。 ;示例2 DogSound:=“汪汪~~” DogName:=“狗” DogCalling(){ global MsgBox,% DogName “:” DogSound return } DogFuncObj:=Func(“DogCalling”) %DogFuncObj%()但是,现在你用的是"面向对象”,那么你就不能用这种方法。 DogFuncObj:=Func(“Calling”) %DogFuncObj%()因为,你只提供Calling这个方法名,程序不知道该调用狗的还是羊的,程序默认在函数中搜索,又找不到一个叫做Calling的函数,那么就会返回false。那么就用ObjBindMethod,先把是狗还是羊提供一下。;示例3DogFuncObj2:=ObjBindMethod(TheDog,“Calling”),%DogFuncObj2%()那么能不能用Func()+Bind() 完全替代 ObjBindMethod()?大多情况下可以相互代替大多数情况是可以的,但也有例外。首先我们看一下示例1,你会发现一个this关键字。这个this是什么意思呢?因为在你建立Class的时候,你并不知道将来是狗还是羊,那么你就用this来泛指一切动物对象。 ;示例4 Calling(){ MsgBox,% this.Name “:” this.Sound return }再看一下这个方法,方法的域是独立的,方法中本没有一个叫做this的东西,那么this从哪里来?答案是,this从参数中来,其实这个方法的本来面貌应该是。只是为了可读性,省略了罢了。 ;示例5 Calling(this){ MsgBox,% this.Name “:” this.Sound return }所以,Func()+Bind() 可以替代 ObjBindMethod(),方法如下。;示例6DogFuncObj3:=TheDog.Calling.Bind(TheDog),%DogFuncObj3%()示例3和示例6是完全等价的。特殊情况下不能代替之所以我们能够这么用,是因为TheDog.Calling这个东西是我们自己搞出来的,我们对这个FuncObj本身具有访问权限。但是,对于系统自带的Obj,比如FileObj,我们是没有这个权限的,在这种情况下,我们就只能用ObjBindMethod。;示例7file := FileOpen(“D:test.txt”, “r”)getLine := ObjBindMethod(file, “ReadLine”)getLine2 := file.ReadLine.Fucn(file)MsgBox % %getLine%()MsgBox % %getLine2%()第一次 %getLine%()可以读出文字,第二次%getLine2%()就生没辙,因为file.ReadLine你没有权限拿到。这个系列的其他文章看这里[中级] AHK元编程初步:对象协议和__Get() v2[中级] AHK元编程实战:用__Call()魔改默认基对象 v2End心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 ^_^GitHub欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。欢迎给 新生的 BeanLib 投稿,每一位贡献者的名字都将被铭记。更多文章:[专栏] AHK程序设计 - 简书(优先持续更新)[基础] [GIF动图] 绕过中文输入法发送文本的3种方法[基础] AHK函数对象系列-绑定函数对象v3[基础] AHK函数对象系列-绑定方法对象[基础] 在AHK中实现函数重载的效果[基础] AHK函数对象系列-对象属性与数据域保护v2问题解答:[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释版权声明:该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。文章版本:v1AHK版本:1.1.30.00 ...

January 9, 2019 · 1 min · jiezi

[中级] AHK元编程实战:用__Call()魔改默认基对象

AB012-[中级] AHK元编程实战:用__Call()魔改默认基对象在上一篇文章中,介绍了AHK元编程的基本概念和常用元函数__Get(),其实__Set()和它是大同小异,这里就不单独说了。下面主要是来说一下"默认基对象"。默认基对象什么是默认基对象?AHK中有两种数据类型,分别是 String 和 Object,String 可以是直接量。但其实String的本质也是 Object,只不过他也是一个系统内置的 Object 罢了。更改String的实际需求由于AHK中 String 并没有内置方法,所以很多时候会非常的不方便。比如当我们想获取 String 长度的时候,我们需要StrLen(Str),其实最符合直觉的办法应该是Str.Length。当然还有很多我们需要的方法没有提供,比如最基本的Str.toArray(转为字符数组),Str.CharAt(提取某一位置的特定字符)等等等。那现在我们就来给 String 加入这些实用的方法,下面将会以最简单的Str.Length为例子演示。魔改获取默认基对象String 的基对象可以由任何字符串获取,这个是非常好理解的,String 是一定是 StringClass 对象,所以可以这么获取"".base。要注意的是,base 本身不能被替换,因为如果被替换,那么 String 的语法就全都完蛋了。[注1]方案1:替换 base 成员base 里面的元函数成员是可以被我们替换的,我们想实现Str.Length这种形式,需要对__Get()进行替换,那么我们该怎么实现这个替换呢?[注2]想一下上一节讲到的"对象协议",()这个语法对应的协议是什么?很明显就是__Call(),那么什么东西含有__Call()? 只要能被()语法所调用的都可以是含有__Call()的。回顾一下之前学过的内容,大概有这么几种可能,首先是 Func 对象,然后是 ObjBindMethod 对象,还有 MethodObject。[注3]其实 ObjBindMethod 我们并不需要,因为我们现在可以自定义, ObjBindMethod 只是在我们不能获取Object 的时候使用的,现在能获取,显然就用不到;另外我们需要预留出参数使用,我们并不知道现在的参数是多少,所以更不能进行Bind。Func对象替换这里提一句,这个办法官方叫做"伪属性",“属性"之前我们提到过,其实"属性"可以看做__Get()和__Set()的语法糖。这样思路就非常简单了,我们先定义一个函数,之后使用 Func(FuncName)获取一下。但是这里要特别注意的是,我们定义函数的时候,需要给 对象 留出一个参数。我们先来看一下之前的例子。MateObj:=new Mate()DeBugDeepPrintln(MateObj[1,2],“MateObj[1,2] >>> “)Class Mate{__Get(aName,Para*){if (aName=1){return “A”}}}你可以看到之前的例子,第一个参数是aName,其实还有一个隐含的参数没有写出来,这个参数就是Object,方法必须从属Object,当其被 extends 使用的时候,这个Object就是this,直接被使用的时候Object就是ClassObject本身。[注4]但是当我们直接使用 函数 的时候,并没有从属于Object,所以我们必须手动把这个参数给加上去。StringGet(Str){StrLen(Str)}theFuncObj:=Func(“StrLen”)”".base.__Get:=theFuncObjtheLen:=“I Love You”.length运行的结果就是 theLen=10。但是这个方法的缺点也很明显,要通过Func()获取对象,非常不方便,那你想定义多个方法的时候是无法实现的,因为 字段 就那么一个,被覆盖就没有了。extends 方案还有一个方案就是利用 extends,虽然我们不可以改动 base,但是我们可以改 base 的 base ,也就是利用 extends。[注5]”".base.base:=StrBasetheLen:=“I Love You”.lengthDeBugDeepPrintln(theLen,“theLen >>> “)class StrGetBase{ __Call(aStr,aName,aParams*){ if(ObjHasKey(this,aName)){ OutPut :=this[aName].Call(aStr) return OutPut } else return "” } }class StrBase{ class __Get extends StrGetBase{ length(){ return StrLen(this) } ;…………. ;…………. } }这个方法的好处就是显而易见了,后面可以跟无穷无尽的方法,你加多少个方法都可以。之后我会把自己用的比较多的 String 方法 上架 BeanLib , 有兴趣可以下载源码看看实现。关于隐藏的两个元函数元函数除了这两个之外还有两个,不知道为什么在帮助文档上没有提,这里简单的说一下。一个是__Init,还有一个是 NewEnum,在帮助文件上,几乎找不到它们的踪迹(只有两处略微提到一句)。第一个的意思是"initialize”,翻译为"初始化”,也就是在new之前调用的。第二个就比较容易理解,就是 for语法的元函数,调用枚举器。我就不多说了,有兴趣查英文资料吧,中文没有。当然如果你会C++,直接看源码也行。本人英语渣,正在努力,看你们的啦,我啃不动。发现了啥好东西,别藏着掖着啊,做人要厚道。当然还有__New和__Delete,不过好像想不出什么用处来,帮助文件上,其实也没有提到他们作为"元函数"的用例。最后提一嘴__Set()想半天觉得这个__Set()还是有个地方需要说一下的,__Set()的设计需要遵循 return value,也就是参数value = return 值。为什么有这个要求呢?是因为预制的对象都是这么搞的,if(b=v1:=v2)这种用法很常见,如果要搞特例的话,别人用起来是很蛋疼的。元编程还有什么用?在第一篇文章中,我提到过,“我不知道有啥用”,其实我已经用这个方法改 String 很久了,连我自己都忘了,今天写第二篇文章才想起来。至于其他的用法,应该会有很多吧,去英文网站上看了一下发现了这个精辟的帖子。里面货很多,元函数的用法,只有你想不到,没有他做不到。有空的话你可以搬出点东西来自己用,然后顺手整理一下,投稿到 BeanLib ,非常欢迎。注释[注1] : 帮助文件中并没有解释, base 不能被直接替换的原因,但是我认为这个解释是显而易见的。[注2/3] : 在AHK中,Class 内的方法是可以直接用 Call() 调用的,而且他们是占据字段(Field)的。比如,如果Func 是你定义的一个函数,你可以再给Func赋值,比如Func:=“ABC”,Func函数是不会被覆盖的;但是Func如果是 方法 ,那么就会被直接给覆盖,这个和 Class 是一个原理。官方没有给他们起一个名字,显而易见他们叫做MethodObject(方法对象)是非常合适的,因为 官方把同样占据 字段 的 Class 叫做 Class objects(类对象) 。[注4] Class/Method 本身就是对象, Method 就不存在是否 static 的问题,都可以调用。[注5] extends 翻译成"继承"比较多,实际上它的原意是"扩展"/“扩增”。B extends A,意思就是"B 从 A 延伸而来",换一种说法就是"B 是 A 的基础",所以B.Base:=A,和A extends B是一个意思。End心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 ^^GitHub欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。欢迎给 新生的 BeanLib 投稿,每一位贡献者的名字都将被铭记。更多文章:[专栏] AHK程序设计 - 简书(优先持续更新)[基础] [GIF动图] 绕过中文输入法发送文本的3种方法[基础] AHK函数对象系列-绑定函数对象v3[基础] AHK函数对象系列-绑定方法对象[基础] 在AHK中实现函数重载的效果[基础] AHK函数对象系列-对象属性与数据域保护v2[中级] AHK元编程初步:对象协议和__Get()问题解答:[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释版权声明:该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。文章版本:v1AHK版本:1.1.30.00 ...

January 8, 2019 · 1 min · jiezi

[中级] AHK元编程初步:对象协议和__Get()

AB011-[中级] AHK元编程初步对象协议和__Get()写在前面其实我本人对"元编程"也没有什么实际应用经验,因为我之前学的语言是Java,没接触过"元编程"的概念。AHK的元编程,至少从国内的资料来看,是没有人用过的,帮助文件又太晦涩难懂,所以很大程度的限制了它的使用。本来我想等有实际案例了之后再写,但是觉得还是"完成大于完美",这里就发出来吧,也算是"抛砖引玉"。这是"AHK元编程初步"系列的第一篇文章,主要是介绍对象协议和__Get(),之后将会陆续介绍更多的内容。教程的下一步计划"AHK元编程初步"系列完成之后,先之前的坑填上,Object,SimpleArray(集合),继承(扩展),Exception。这些至少要涉猎一遍,之后就会出 GUI/HotKey/HotString 教程,也就是"事件驱动编程"。学完"事件驱动编程"之后其实你就可以愉快的装逼了,因为你可以搞出框框。屁话不多说,让我们开始吧。对象协议我尽量的说得通俗易懂一些,如果你没有使用Object和Base的基础,有些地方可能是有一些难懂的,只要提到陌生的概念,我就会说一下。简单解释protocal和元编程对象协议(object-protocol)是什么意思?如果你有其他的编程基础,比如Java/C#,那么我可以告诉你,这个protocol其实就是interface,可以说是一个意思的。这里给不懂的简单的解释一下。interface/protocol就是一种标准,其他的类可以继承(extend)interface,继承之后要求必须Override其中的所有"抽象方法"。用最大的大白话来讲,就是"契约/协议",就好像劳动合同一样,只要你签订了之后,你就必须要干合同里约定的活。AHK的底层"劳动合同"就是三个分别是Get(获取) 一个值.Set(设置) 一个值, 使用 :=.Call(调用) 一个方法, 使用 ().也就是说,任何东西都必须实现Get/Set/Call这三种方法。实际上这三种方法是由AHK自动生成的。 你不去手动定义,他们也是存在的。元编程,就是直接对这三个底层方法进行改动,对自动生成的过程进行接管。所以元编程可以说是"脱内裤"。对象协议的语法糖之所以要把他们搞得这么"底层",就是因为这些东西太常用了,平常是不需要改的。这也就是"编程语言"的意义,让编程更加的自然语言化,更加的容易读懂。特殊条件下,我们不满足于他预设的这些"语法糖"。我们需要深入到内部进行更改,这样的话,我们就要学习运作的一些细节。Set和Get的语法糖最常见的就是形式是 myObj[name] 和 myObj.name示例-AB011-1:get的两种常用语法糖myObj:=[“A”,“B”]DeBugDeepPrintln(myObj.1,“myObj.1 >>> “)DeBugDeepPrintln(myObj[1],“myObj[1] >>> “)第一种形式,是绝大多数编程语言中给"数组"使用的语法糖,第二种形式是"属性(变量)“常用的语法糖。它们对应元函数是__Get(aName){}咦,在SciTE中为什么提示,可以放入很多参数呢?其实这个__Get是完全可以自定义的,虽然默认生成的都是一个参数,那你完全可以这么搞。__Get(aName,para*){}Para是"可变参数”,“可变参数"其实是一个数组,它的默认值是‘[]’空数组,所以可以不填。填入任何其他的元素,都会直接装入这个数组中然后传递给调用者。在AHK中如果找不到对应的元函数,那么就会返回空字符串,也就是相当于直接写return。所以,如果你用get的第三种形式,这么写的话,在默认的任何Object中都不会报错,而是直接返回”"。myObj:=[“A”,“B”]DeBugDeepPrintln(myObj.1,“myObj.1 >>> “)DeBugDeepPrintln(myObj[1],“myObj[1] >>> “)DeBugDeepPrintln(myObj[1,2],“myObj[1,2] >>> “)那下面我们就通过元编程,让myObject[1,2]可以正常被调用。__Get()实操之前我们创立对象的时候用的是myObj:=[“A”,“B”],其实这就是AHK自动生成的对象,所以它是不受我们控制的,这种方法其实可以看成myObj:=Array(“A”,“B”)的语法糖。既然我们要深入细节进行改动,那么就不能让它自动生成了。所以我们需要用到Class。MateObj:=new Mate()DeBugDeepPrintln(MateObj[1,2],“MateObj[1,2] >>> “)Class Mate{__Get(aName,Para){if (aName=1){return “A”}}}好,到这里为止,你就创造了一个"AHK的新语法”。这算是对AHK元编程的初体验吧,之后会带你看更多有意思的示例。End心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 ^_^GitHub欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。更多文章:[专栏] AHK程序设计 - 简书(优先持续更新)[基础] [GIF动图] 绕过中文输入法发送文本的3种方法[基础] AHK函数对象系列-绑定函数对象v3[基础] AHK函数对象系列-绑定方法对象[基础] 在AHK中实现函数重载的效果[基础] AHK函数对象系列-对象属性与数据域保护v2问题解答:[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释版权声明:该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。文章版本:v1AHK版本:1.1.30.00

January 3, 2019 · 1 min · jiezi