阿让的AutoHotkey十年使用总结和脚本分享

接触ahk近十年来,各类热键操作大幅简化电脑使用,提升效率,获益良多。现将本人多年自用热键脚本上传于论坛,供大家参考,算是对自己学习ahk的一点总结回顾,也算多多少少为ahk社区做点贡献,并向各位ahk界前辈大佬致敬。

注意:本文探讨的脚本版本为AutoHotkey1.1版本

1.脚本宗旨

1.1主要目的。就是通过热键简化一切可以简化的操作。电脑用到哪,热键就写到哪,哪里用的不爽就写哪里。三步并作两步、两步并作一步,只要个人觉得应该简化的操作,就写个热键。
1.2实现方式。就是最为基础的“热键名称::热键功能”模式,在一定场景下,按下指定热键,实现想要达到的功能。简陋粗糙,但非常实用,这也是我最喜欢ahk的原因所在。当然,这也限于本人仅为业余编程爱好者能力有限,且日常需求不高,所以比较容易满足。

2.主要功能及说明

2.1以字母a键、空格键作为修饰键替代ctrl、alt等
简单举例:
a & f替代ctrl+c
a & g替代ctrl+v
a & v替代ctrl+x
a & b替代ctrl+b
a & s 替代ctrl+s
Space & f替代AltTab
Space & g替代alt+f4
……
为了有效提升效率,减少手指移动,几乎所有常用热键均被我替换为了字母a键、空格键等作为修饰键的热键,日常操作大为顺手。之前也曾考虑过使用CapsLock键、tab键、~键作为修饰键(例如CapsLock+软件),后来实践中发现还是a键、空格键最为方便,毕竟左手小指、拇指一直放在这两个键位上,使用时基本不用再移动。
当然有人可能会说,那还不如抛弃鼠标,实现全键盘操作。但限于个人能力,我还无法完全使用全键盘,所以通常都是左手键盘、右手鼠标的状态,两者配合也还不错。
不过,这里有一个较大的坑,后面统一再讲。

2.2使用单键作为热键(类似vim、vimd等)
为什么电脑绝大多数热键都是两个键(例如ctrl+c)、三个键(例如ctrl+alt+delete)甚至更多键呢?为什么不能只按一个字母c就代表复制呢?其实在很多地方本应该是可以的。得益于对vim编辑器、火狐pentadactyl插件的了解,以及Total Commander的强大配置,我设置了一些单键热键的场景。不过,远没有vim、vimd那么高级,也并没有考虑所谓模式区分,而是仅仅在自己觉得应该使用单键的地方设置单键热键,就足够我个人使用了。
简单举例:
2.2.1在Total Commander及资源管理器中:
按键数字1代表复制当前文件的路径(不包含文件名)
按键数字2复制当前文件名
按键数字3复制当前文件路径(包含文件名)
按键c复制当前文件
按键z删除当前文件
按键w新建文件夹
……
2.2.2在IrfanView及部分图片浏览器中:
按键f代表下一张图片
按键s代表上一张图片
按键r代表顺时针旋转
按键w代表逆时针旋转
……
2.2.3在PDF阅读器中:
E代表向上
D代表向下
F代表下一页
……
2.2.4在qq/微信聊天组合窗口:
Tab代表上一个聊天窗口
CapsLock代表下一个聊天窗口
……
2.2.5在各种保存窗口:
F代表否
S代表是
G代表取消esc
……
2.2.6在通用界面:
F11代表获取鼠标位置坐标
CapsLock单击代表回车,双击代表Backspace
……
其实,还有很多很多界面均可以实现类似的单键热键功能,例如听歌软件、视频软件、浏览器(借助插件功能更完善)、各种阅读器等等,大家可以自行研究,实现原理基本都差不多。使用熟练后会大呼过瘾。

2.3自动切换中英文输入法,及自动关闭广告窗口
作为中文用户使用电脑有一个非常不方便的地方,就是想打中文的时候输入法是英文的,想打英文的时候输入法却是中文的,不知道为什么目前各大输入法厂商均没有想过稍微解决一下这个问题。我目前的做法,一方面是将系统默认输入法设置为搜狗拼音,毕竟日常打中文的时候更多一些;另一方面就是通过ahk将部分比较确定的窗口界面设置为固定的英文输入状态。
例如:任务栏、图片浏览、视频浏览、阅读器等等界面均设置为英文,当切换到这些界面的时候,输入法自动切换为英文状态。这样也便于发送单键热键功能。
同时,由于ahk为单线程语言(不知道现在有没有改进),而切换输入法及关闭广告窗口功能实现原理相同,所以两者代码是放在一起的。即通过WinWaitActive监测当前窗口,当发现窗口改变后符合一定规则就运行相关功能。不过关闭广告窗口功能建议使用360更合适。

2.4快捷启动软件及个性化功能(类似altrun等)
实现方式有3种:
2.4.1界面选择模式。通过alt+r启动gui界面,输入拼音首字母筛选相关软件或功能,回车执行。如图1所示:

如果筛选后没有结果,回车会使用默认浏览器进行百度搜索。
如果输入前缀关键字,还可以实现特殊搜索或功能。例如输入“jd鼠标”,就可以实现在京东官网搜索鼠标商品。其他类似。
2.4.2任务栏单键启动模式。切换鼠标焦点到任务栏(可以用热键或鼠标点击任务栏),按单键启动。
例如:w启动word。E启动excel。T启动Total Commander等等。
2.4.3组合热键启动模式。可以个人设置常用热键启动常用软件或功能。例如:
a & 4启动为知笔记
a & r启动notepad2
a & w启动word
Alt & 1用scite打开当前脚本
Alt & 2关闭屏幕
Alt & t置顶当前窗口
Space & 2使用everything搜索当前选中内容
Space & 3使用浏览器搜索当前选中内容
Space & q打开QQ(主要通过任务栏图标实现)
Space & w打开微信(主要通过任务栏图标实现)
Space & t打开Total Commander
……
使用ahk的好处就在于,所有功能均可以由自己根据需求编写,例如快捷启动功能,你不仅可以启动单个软件,也可以执行一段代码,还可以实现一批组合操作,这比起使用altrun等固定软件来说灵活多了。

2.5超级菜单(类似candy、quickz等)
右键菜单是一个非常便捷、实用的功能,但通常不能由用户自己编辑。使用ahk,可以根据自身需求定制属于自己的超级菜单:即根据当前界面或当前选中的文字、文件等弹出不同的菜单选项,后续可继续通过热键或鼠标选择,执行相关功能。
简单举例(我设置的超级菜单热键为空格+s):
当前选中文字:按下空格+s后弹出菜单,菜单内容包括翻译、复制到word、查找ahk帮助……
当前选中txt文件:超级菜单内容包括通过notepad2打开、scite打开、everedit打开……
当前选中xls文件:超级菜单内容包括excel打开、WPS打开……
具体菜单项及功能均可以自己设置,与上一条相同,也可以实现多步骤的功能。

2.6任务栏鼠标滚轮或上下键更改音量
这个功能非常简单,就是鼠标点到任务栏,向上滚轮时音量变大,向下滚轮时音量变小,使用上下键也是同样。会有一个简单的图形界面显示,及数值显示,变化步长为5%。由于代码写于使用win xp时期,在win7下图形数字略有错位,但不影响功能使用。

2.7word/excel/WPS等功能热键
word/excel/WPS是最常用的办公软件,为简化操作,设置了一些热键实现部分常用功能。例如:
2.7.1在word中:
F1-3分别设置一级、二级、三级标题格式,为正式公文格式,含大纲级别,使用过文档结构图的应该比较了解。
F4设置大标题
F7设置正文格式
……
2.7.2在excel中:
F2为自定义排序
F3为自动筛选
F5为添加或删除边框
F6为设置数值格式(两位小数)
F7为设置文本格式
F8为设置百分数格式(两位小数)
……

2.8网页自动登录
在特定页面,按热键自动填充账号、密码,实现自动登录功能。目前仅限于IE浏览器,个人也仅在内网使用。外网可以有lastpass等密码管理软件更实用。相关代码在网上有很多资料,可自行查找。

2.9热字串功能
用的比较少,个人主要用于法规政策中的文号输入,如〔2019〕这种。
具体可以参考ahk帮助文档。

2.10尽量统一各类编辑器热键功能
由于各种需要,曾使用过notepad2、notepad++、scite、everedit,以及word、excel、WPS等各类编辑器,但他们的各种热键功能各不相同,于是曾经想要给各种常用编辑器设置一套相对统一的热键,甚至做好了相关规划,但后来由于能力有限,未能完全实现,甚是遗憾。主要想法如下,部分功能已实现。希望后续有大佬能够帮忙完成。如图2

其实,对于阅读器、图片浏览器、视频浏览器等我也设置了一套相关统一的操作热键,具体不再细说。

2.11输入成对符号
包括() <> “” ”{} [],另加一个:=,主要代码如下:
~, & Shift Up::Send >{Left}
按键手法需注意:先按住shift键,再按住逗号键,然后松开shift键,再松开逗号键。其他类似。不过,后来由于搜狗拼音输入法出了成对符号补全功能,叠加之下使用该代码有时会多输出一个符号,尚未考虑修复。

2.12与鼠标手势软件联动(例如strokeit等)
相比ahk来说,鼠标手势软件通常灵活性要差一些,但借助热键的桥梁,可以实现相互联动。即:先在ahk中定义好热键和功能,然后滑动鼠标手势发送该热键,热键即可执行ahk中设置好的功能。

2.13针对其他具体软件、界面的各项热键功能
具体不再列举,根据个人在日常使用中随时需要随时补充。

3.目前已发现的主要缺陷或bug

3.1该脚本为个人自用脚本,未考虑图形界面,所有配置及修改均为对源代码直接修改,上手操作及个性化设置可能会有一点难度。不过由于绝大部分代码均为最基础的“热键名称::热键功能”模式,入门ahk后总体不难。
3.2脚本启动后首次按下某些热键时,可能不会生效,而是由输入法打出相应字符,第二次及以后按下热键才能正常使用。该bug在脚本编写初期(2013年左右)就已发现,但由于能力有限至今无法修复。初步怀疑与系统默认输入法为搜狗拼音有关。
该bug相对可稳定重现的情况是:通过Alt & 1热键用scite打开当前脚本后,相关热键第一次按下时也不会生效,必须第二次才能使用。
3.3脚本正常使用中,会时不时出现修饰键不弹起的bug。如按下某个热键(如a & s:: Send ^s)后,ctrl键有可能不会自动弹起,导致后续只按某个字母键时,就会触发ctrl+该字母键的功能,甚至引发其他故障。Alt、shift等其他修饰键也有该问题。该bug也是在脚本编写初期(2013年左右)就已发现,但由于能力有限至今无法修复。
该bug相对可稳定重现的情况是:复制一张图片,通过a & g热键粘贴,之后有较大概率会出现修饰键不弹起的情况。
该bug最影响日常使用,临时解决办法是重启脚本,例如我设置的热键:
ralt::
Suspend
Reload
return
3.4字母a键、空格键作为修饰键后会影响打字速度。这是字母修饰键的一个大坑,也就是说如果打字速度过快,当连续按下a、r等键时(如输入拼音打扰darao),会触发a & r热键启动notepad2。这个不知道算不算bug,但由于能力有限也无法改进。好在我本人使用双拼输入法,打字速度慢,基本不受影响,这也是我能够正常使用a修饰键的主要原因。大家可根据需要自行选择。空格键影响稍微小一些。
3.5单键热键在某些场景会影响输入功能。由于场景识别功能的不完善,在某些文本框输入等地方,按下单字母键可能会触发热键功能,而不是输入字母。该问题对我影响较小,主要还是在于对自身需求与功能的判断和平衡。解决方法有2种,一是充分完善单键场景与输入场景的区分识别,二是在需要输入的情况下临时禁用脚本,例如我设置的热键RCtrl:: Suspend。
通常,在大量文本输入的场景下,例如notepad、word、excel等不设置单键热键。
3.6热键多了容易误触。尤其是单键热键,在资源管理器等场景下,不小心按下z键就会导致文件删除,因此使用时务必小心,建议一定要使用回收站功能。并尽量不让别人操作自己的电脑,如果确实要让别人操作,就先退出或者暂停脚本。
3.7语法不甚规范,未进行有效的格式化,部分代码年久失修可能已经失效。该脚本长期是一边用,一边改,本人自学途中也走了很多弯路,有些早期的代码可能会有很多看着不太规范的地方。例如有的标签、变量等名称,早期会使用中文,后来使用拼音,再后来学了点autoit,又专门加上$符号,或者加上<>括号等等,不一而足。大家将就着看吧。有些功能以前可能常用,后来慢慢不用了,也有可能已经失效。
其他bug以后想到再说……

4.使用说明

能辛苦耐心看到这里的人估计不多了,既然如此,还是简单讲讲如何使用该脚本。其实很简单,本来就是ahk源代码,打开运行,在合适的场景按下热键,就可以了。
4.1脚本结构
主要分为3部分。
第1部分为基础设定区。包括ahk语法的一些固定命令常量、个人定义窗口组、个人定义变量、引用外部脚本语句,以及自动切换英文输入法的代码。因为切换输入法需要持续运行监测当前窗口,所以必须放在所有热键定义的前面,脚本打开就开始执行。
第2部分为热键定义区。包括全局热键、各种特定场景界面下的热键。
第3部分为库文件区。包括各类库函数、通用标签、子程序等等。
另外,单独设置了一个UserSetting.json配置文件,需放在脚本相同目录下。主要用于填写个人使用的各种软件的具体路径,便于脚本识别寻找。不过脚本中也预留了读取ini配置文件的功能(需自行修改启用),因此也可以使用ini配置文件。
4.2部分个性化修改方法
4.2.1添加修改快捷启动软件列表步骤:1.添加修改AltrunList变量,即软件名称。2.在配置文件中增加相应软件路径,名称与AltrunList中的变量名一致,便于使用通用标签,建议使用中文。3.特殊需求则单独添加与AltrunList中变量名称一致的标签。
4.2.2修改超级菜单:相应代码在热键Space & s项下,可自行添加修改文件后缀名、菜单名称及功能、执行功能的标签。
其他基本就是直接修改对应热键代码即可。由于主要是个人使用的脚本,具体代码我不会花时间做更多解释,部分功能的实现如果有空可以略微讲一讲。大家也可以自行实践,或参与论坛、QQ群讨论。脚本中除了ahk语言本身外,同时还涉及VBA、HTML、js、json、正则表达式等相关知识,但均为比较基础的部分。

5.致谢

5.1衷心感谢ahk论坛、QQ群各位前辈、大佬对ahk的无私奉献和对我的具体帮助,让我一个毫无编程基础的小白能够使用ahk这个优秀的工具实现一些常用操作的简化和效率的提高。包括但不限于:amnesiac、tmplinshi、RobertL(萝卜L)、Thinkai、米洛特、刘玉宽(liuyukuan、YuKuan、sunwind)、林欣宏(StarRed、Array、艾瑞)、小古(huyaowen)、Party、一壶浊酒、迷雾、Running、依英、馋猫、河许人、胡杨、zxh(space)、尘土飞扬、假面、火冷、宗师归来、AHK_小猛、Ez、卢霖、紫镜、fwt、greatYear(yyy)、link,以及发图的小武……
脚本中也借用了ini2obj()、JSON.Load、Excel_Get()、IME_GET等输入法相关函数、zh2pyRegexList等拼音首字母搜索相关函数、acc函数集合等等库文件,在此也对相关作者表示感谢!

作者:阿让(arang)
2021年1月20日

阿让的AutoHotkey十年使用总结和脚本分享

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

用tmdbAPI查看电影信息

2021-1-31 15:27:18

其他案例

使当前窗口向左延伸贴靠其他窗口

2021-2-19 11:04:24

35 条回复 A文章作者 M管理员
  1. 阿森

    膜拜大佬 大佬牛逼

  2. pikocc

    这个太厉害了,用a简直打开了脑洞

  3. fredwu

    这个主要还是热键替代,而不是使用编程对部分重复操作进行循环性的处理,效率提高主要的个人的操作方面,而不是工作方面。

    • hexuren

      那你总结一个?

  4. 大道也

    受教了,思路很重要。

  5. yusihai719

    学习一下,刚入门

  6. 阿根廷

    学习一下 好的东西还不会

  7. 小丸

    学习了,多谢,

  8. heku

    感谢大佬的脚本!学习一下

  9. Der

    学习

  10. flyboy

    学习了,思路大开

  11. Elent

    ???牛

  12. bauhauschyn

    大约10多年前XP时代就知道AHK了,但是只听说国外搞得很火。现在学习PPT,里面有的操作根本无法单手完成,才想起来用AHK修改快捷键。没想到很简单。这个功能对于我完全够用了。

  13. james

    学习了,多谢

  14. user14914

    下午后怎么是乱码,各种编码都试过,都不行,请哪位高手看看?

    #SingleInstance force ;???????????,????????
    #NoEnv ;???????????????
    #HotkeyModifierTimeout 0 ;???????????????CTRL??ALT??WIN ??SHIFT???? 0 ??????? (?????????????????????).
    FileEncoding, UTF-8-RAW
    Process,priority, , high ;?????????????
    CoordMode, ToolTip ;ToolTips????????????
    SendMode,Input
    send, {Alt Up}{Ctrl Up}{Shift Up}{LWin Up}{RWin Up}{a Up}

    ;{????????GroupAdd,tccopy, ahk_class TInpComboDlg ; ?tc????????????
    GroupAdd,tccopy, ahk_class TDLGUNZIP ; ?????????????????
    GroupAdd,tccopy, ahk_class TDLGZIP ;?????????????
    GroupAdd,tccopy, Total Commander ahk_class #32770 ;???��????????????????

    • hexuren

      编码问题,换成带bom的编码格式

  15. 小幸福

    使用软件一直报错,错误如下,麻烦大佬看下呗 图中蓝色标注的就是263行,没有找到对应的% Error at line 263. Line Text:% Error:This parameter contains a variable name missing its ending percent sign. The program will exit.

    • hexuren

      你用的哪个版本的AHK? 我测试ahk1.1没有问题的

  16. 老王头

    ;{………………………………………………………………………………………………热字串 :*? B0:koh:: Hotkey, $Space, off KeyWait, Space,d T1 if ErrorLevel { Hotkey, $Space, on return } send, {bs 3} sendinput,〔201〕 send,{left} Sleep, 100 Hotkey, $Space, on return ;} 这一段是什么意思,哪位大神帮忙解释一下

    • ☆阿让·晓刚

      这是一个很个性化的需求,用于输入文号如“国发〔2010〕5号”中的年份,按键为“koh”这3个字母(括号的拼音前几个字母),输出结果为“〔201〕”,且光标在1后面(因为当时201x年份的文件比较多),便于修改。

  17. 星星之岛

    膜拜大佬,ahk 永远的神

  18. 星星之岛
    星星之岛给您捐赠了¥1
  19. Elliont

    感谢大佬,最近刚开始接触AHK,发现的确是效率利器

  20. 陈大锤

    请教各位,为什么,我用AHK的热键以后,WPS就无法关闭,就卡在白板了

  21. 理查德

    这么强大。。。服了

  22. 理查德

    谢谢分享,下载了

  23. 可乐

    把a作为修饰键后,在输入字母a或拼音有时,会出现时滞延时,请问有办法解决吗

    • ☆阿让·晓刚

      这个问题在3.4已经说明了,很早以前也曾向RobertL(萝卜L)等请教过,但可能受限于程序自身判断需要,一直没有解决。有2个思路,一个是通过KeyWait设置后续键的时长,另一个是先设置a及相关字母发送自身,$a::send,{a},再设置a & j::send,{left};j & a::send,{left},可能能够提升速度。但不管哪种,热键代码都将变得非常复杂,我需求不大,就没有继续了。

  24. 大海

    感谢大佬

  25. Mervyn

    通过ahk将部分比较确定的窗口界面设置为固定的英文输入状态。
    这个是怎么做的,先判断当前是否为符合的窗口, 然后呢,如何控制搜狗输入法的中英文状态呢?我是通过shift切换,但是不知道怎么判断当前输入法是中文还是英文的?

    • ☆阿让·晓刚

      循环判断当前窗口名称。不用判断当前输入法是中文还是英文,直接输出命令切换到英文即可,这里借用了IME_GET等输入法相关函数,挑出了其中切换中英文的命令。

个人中心
购物车
优惠劵
有新私信 私信列表
搜索