一直想着将自己学习使用ahk的经历心得做一些分享,帮助新入门同学减少弯路,但自从去年写了十年总结后就没了下文,最近稍有闲暇,于是先将其中我日常使用最多,也最喜欢的单键热键功能做个简单梳理,后续抽空再写其他。
主要涉及内容为《阿让的AutoHotkey十年使用总结和脚本分享》中2.2使用单键作为热键(类似vim、vimd等)相关部分。讲解下学习经历、思路和一些入门疑难问题,高手们请忽略。
1.单键热键是什么?有什么用?
单键热键就是使用单个按键作为快捷键,包括单字母、单数字等键盘上任意的一个按键。电脑中默认的快捷键通常都是两个键(例如ctrl+c)、三个键(例如ctrl+alt+delete)甚至更多键,因为要与文字输入相区别,但其实很多场景下是不需要输入的,这时使用单键热键就有很强的优势,例如看图片、看视频、听音乐、PDF等阅读器、文件夹(资源管理器)、浏览器等等,而且用过vim编辑器、火狐pentadactyl插件、ps单键快捷键等之后,就想在更多的地方使用单键,例如用s、f切换左右标签,切换上一或下一图片歌曲,用x关闭窗口等等,这就是最初的想法。那么该怎么开始呢?
2.为不同窗口(软件、场景等,下同)设置不同热键和功能
学会ahk“热键名称::热键功能”语法后,设置热键是很简单的。但要设置单键热键,首先要明确区分使用场景,否则该字母在全局都会是热键功能,就会影响打字了。这个问题主要用#IfWinActive + WinTitle来解决,如果系统学习过ahk帮助文档应该是都知道的,建议新人优先系统看一遍帮助文档,或者系统学习下本站河老板的教学视频。
2.1.基本不需要输入文字的窗口
例如看图片、看视频等,这就很简单了,直接在对应的窗口代码下设置热键即可。例如我设置的:
在图片浏览器、视频播放器中:(不区分大小写,下同)
按键f代表下一张图片、前进n秒
按键s代表上一张图片、后退n秒
按键r代表顺时针旋转
按键w代表逆时针旋转
按键x代表关闭
按键z代表删除文件(删除时通常会弹出确认窗口,可以再加个判断自动点确定删除到回收站)
……还有放大缩小、不同视图、字幕延迟等其他功能可以自行设置。
在各种保存窗口:
F代表否
S代表是
G代表取消esc
x代表关闭
……
其他软件类似,重点是用ahk自带的windows spy功能找到不同场景的窗口识别代码,通过标题、ahk_class、ahk_exe等方式进行明确。
各种保存窗口这里要注意,一是窗口识别代码要进一步明确,因为其ahk_class 为#32770,但这个识别码在windows系统的很多弹出窗口都是一样的,所以要进一步添加标题、内容文本等进行确定。二是这里使用了窗口组,因为很多不同软件的保存窗口都有类似的需求,一个一个列举太麻烦了,就可以整合到一起。窗口组的定义要放在脚本前面。
;各种保存窗口类型1(注意不是另存为窗口),特点:有3个选项:是(默认,回车、s、y)、否(n)、取消(esc)
GroupAdd,savebox1, Microsoft Office ahk_class #32770 ;…………………Microsoft Office 03/07版保存窗口
GroupAdd,savebox1, Microsoft ahk_class NUIDialog ;………………………Microsoft Office 2010版保存窗口
GroupAdd,savebox1, Microsoft Word ahk_class #32770 ;…………………word 2010版关闭时剪贴板含有大量数据
GroupAdd,savebox1, Microsoft Excel ahk_class #32770 ,在剪贴板上有大量信息 ;excel 2010版关闭时剪贴板含有大量数据
GroupAdd,savebox1, Notepad2 ahk_class #32770,保存 ;……………notepad2保存窗口
GroupAdd,savebox1, 记事本 ahk_class #32770,保存 ;……………记事本保存窗口
GroupAdd,savebox1, SciTE ahk_class #32770 ;…………………scite保存窗口
GroupAdd,savebox1, EmEditor ahk_class #32770 ;…………………EmEditor保存窗口
GroupAdd,savebox1, EverEdit ahk_class #32770 ;…………………EverEdit保存窗口
GroupAdd,savebox1, Imagine ahk_class #32770 ;……TC图片预览最后一张时弹出的界面
GroupAdd,savebox1, Total Commander ahk_class #32770 ,此标签已被锁定 ;tc关闭锁定标签
GroupAdd,savebox1, TdxW ahk_class #32770 ;……………………通达信关闭后提示是否下载数据
GroupAdd,savebox1, 福昕阅读器 ahk_class #32770 ;……………………pdf福昕阅读器保存窗口
GroupAdd,savebox1, Save ahk_class #32770 ;……………………notepad++保存窗口
GroupAdd,savebox1, ahk_class QWidget ;……………………WPS保存窗口
#IfWinActive ahk_class ShImgVw:CPreviewWnd ;{……………………………图片查看器
e:: Send {up}
d:: Send {down}
f:: Send {right}
r:: Send ^k
s:: Send {left}
w:: Send ^l
x:: Send !{F4}
z::
Send {Del}
WinWaitActive,确认,,3
if ErrorLevel
Return
Send {Enter}
Return
#IfWinActive ahk_class QQPlayer Window ;{………qq影音
f::send,{Right}
h::send,c ;切换前后字幕及无字幕(c、h均可使用)
q::send,{Enter}
r::send,e ;顺时针旋转90度。w为逆时针旋转90度,默认热键,不用更改。
s::send,{Left}
x::send,!{f4}
$[::send,+[ ;字幕提前0.5秒
$]::send,+] ;字幕延后0.5秒
#IfWinActive ahk_group savebox1 ;{……………各种保存窗口类型1(注意不是另存为窗口)
f::n
g::esc
s::Enter
x::esc
2.2.可能需要输入文字的窗口
经过2.1.的设置,我们已经可以在部分窗口直接使用单键热键了。但如果这些窗口中偶尔需要输入文字怎么办呢?例如在文件夹中修改文件名,在浏览器搜索框中输入关键词等等。
这是单键热键的最大难点,当年困扰了我很久,后来在一些前辈大能的指点下,终于有了一个相对可靠的解决方法,才使得单键热键能更广泛的应用在电脑日常使用中。
其实就是判断何时应该输入文字,何时应该执行热键。最初的想法是通过输入法来判断,想着打字需要输入法,输入法总该知道自己什么时候该开启,什么时候该关闭吧。但实际上输入法自己也是不知道的,在很多本不需要输入的地方,输入法也是正常开启的。例如任务栏,理论上任务栏不需要任何输入,但输入法却是开启的状态。
后来找到的最有效的方法是判断当前焦点所在的控件,列举出所有需要输入文字的控件名称A集合(或者相反,列出所有不需要输入文字的控件名称B集合),那么,在A集合下就不执行单键热键,在B集合下就执行单键热键。具体用正向思维或逆向思维,看具体软件而定。
以文件夹(资源管理器)为例,其可能有ahk_class CabinetWClass、ahk_class ExploreWClass、ahk_class Progman、ahk_class WorkerW等不同窗口标识,注意区分。通过ControlGetFocus,var语句获取当前焦点所在控件,如果控件名为SysListView321或者DirectUIHWND3,就说明是不需要输入文字的集合B,可以执行单键热键。
#If WinActive("ahk_class CabinetWClass") or WinActive("ahk_class ExploreWClass") ;{……………………………我的电脑/资源管理器
d::
ControlGetFocus,var
if var in SysListView321,DirectUIHWND3
Send {down}
else
Send %A_ThisHotkey%
return
e::
ControlGetFocus,var
if var in SysListView321,DirectUIHWND3
Send {up}
else
Send %A_ThisHotkey%
return
r::
ControlGetFocus,var
if var in SysListView321,DirectUIHWND3
Send {F2}
else
Send %A_ThisHotkey%
Return
1:: ;仅复制文件(夹)路径,不含文件名
ControlGetFocus,var
if var in SysListView321,DirectUIHWND3
{
clipboard =
controlgettext,$path,edit1,a
clipboard :=$path
Sleep,200
ToolTip,%clipboard%
Sleep,1000
ToolTip
}
else
Send %A_ThisHotkey%
return
其他软件类似。包括Total Commander、everything、PDF等各类阅读器、各类音乐播放器等等,它们可能大部分时候不需要输入,但个别时候如搜索框等就需要单独识别了。重点是用ahk自带的windows spy功能找到当前焦点所在的控件,并进行明确区分和列举。控件名称就是windows spy界面中的ClassNN:后面的值了。十年总结提供脚本中的不同软件的相关代码可能略有区别,但总体思路都是一样的,只是陆续进行了整合提炼。
2.3.需要大量输入文字的窗口
如各类编辑器、office软件、wps软件等,这种情况我一般是不用单键热键的,但如果有人感兴趣,有一个思路就是设置切换热键,也就是很多工具所谓的切换模式,即正常模式与vim模式,具体可学习vim编辑器、vimd等工具。
2.4.浏览器等非标准化控件窗口
前面2.2中的方法之所以说相对可靠,主要在于其仅适用于标准化的窗口和控件,且识别需尽量精准,但像浏览器、QQ、wps等非标准化窗口,就不太适用了。
2.4.1.对于浏览器,我更多是使用插件,例如火狐的pentadactyl、chrome的vimium等,已经足以满足我的需求,例如fs分别切换左右标签,ed表示上下,t弹出新标签(或新搜索),x关闭,v下一页等等。
2.4.2.对于qq/微信聊天组合窗口,我只设置了以下两个热键,即
Tab代表上一个聊天窗口
CapsLock代表下一个聊天窗口
QQ还好,但微信后来版本更新后,当焦点在右边聊天内容窗口时,热键失去作用,只有在左边好友或者群名称列表时才有效。
2.4.3.对于其他非标准化窗口,我一般很少设置,但有两个思路,一个是使用ACC库识别控件,另一个就是识别鼠标坐标位置,感兴趣的可以根据具体场景再研究。
2.5.全局性单键热键
主要是Fn键、CapsLock键、鼠标中键等,看个人情况使用。我主要设置了:
F11代表获取鼠标位置坐标
CapsLock单击代表回车,双击代表Backspace
3.其他需要注意及想说的一些内容
- 3.1.热键功能要根据自己需求扩展
在十年总结中我就说过,我用ahk主要就是通过热键简化一切可以简化的操作。电脑用到哪,热键就写到哪,哪里用的不爽就写哪里,其中单键热键就是一个非常实用的功能,配合strokeit等鼠标手势软件更是异常方便。大家不要被“快捷键”三个字所束缚,认为热键只能执行一个小功能,其实ahk最为基础的“热键名称::热键功能”模式是最强大的,热键名称可以简化为单键,但热键功能可以无限扩展,例如在文件夹中,
按1,可以复制文件名,或文件路径
按2,可以为文件名添加当前日期前缀或者后缀,并发送到某个文件夹归档
按3,可以设置通过不同软件打开
按4,可以将文件通过微信等方式发送给自己或者某个人
……
只要是自己感觉需要大量重复的工作,都可以尝试简化。
- 3.2.使用单键最好梳理一套相对系统的思路和逻辑
不要贪多,更要求精。使用ahk后我的一个问题不是热键不够用,而是太多了根本记不住,后来经过长期使用积累,才发现最常用的其实就只有一部分热键和功能,而且规则最好相对统一,在绝大部分场景所执行的功能是一致的。我是使用左手键盘右手鼠标的,大部分热键都在左边,例如:
Edsf分别代表上下左右,主要用于移动位置、切换左右标签、切换上一个下一个文件、前进后退等
F代表否,s代表是(确定),g代表取消,x代表关闭,z代表删除,q代表退出等
wr代表左右旋转,t代表新标签(或新搜索)等
这个在十年总结中的2.10部分也曾提到过。
- 3.3.脚本中不同窗口的顺序会影响热键功能范围
根据本文第2部分为不同窗口设置的同一个热键,如果有些窗口的识别代码比较接近,需要注意其前后顺序,基础规则是识别越精细、越明确的窗口应该放在越前面,ahk帮助文档中有相关说明,不过我已经记不住具体在哪了。大家仔细想想脚本执行顺序应该就能明白。例如:
#IfWinActive Excel ahk_class XLMAIN ;{…excel关闭全部工作表后的窗口(2013版)
#IfWinActive ahk_class XLMAIN ;{………excel
该顺序如果调整后,前者项下的相同热键将失去作用。
- 3.4.单键热键在某些场景还是会影响输入功能,需要持续完善和平衡自身需求
由于场景识别功能的不完善,在某些文本框输入等地方,按下单字母键可能会触发热键功能,而不是输入字母。该问题对我影响较小,主要还是在于对自身需求与功能的判断和平衡。解决方法有2种,一是充分完善单键场景与输入场景的区分识别,二是在需要输入的情况下临时禁用脚本,例如我设置的热键RCtrl:: Suspend。
- 3.5.热键多了容易误触
尤其是单键热键,在资源管理器等场景下,不小心按下z键就会导致文件删除,因此使用时务必小心,建议一定要使用回收站功能。并尽量不让别人操作自己的电脑,如果确实要让别人操作,就先退出或者暂停脚本。
关于单键热键总体差不多就是这些了,以后想到什么再补充。
作者:阿让(arang)
2022年10月15日
感谢分享
感谢分享,我也喜欢单键热键,确实最主要的问题就是记不住,所以我想用个Gui做个帮助窗口来解决这个问题,但是Gui最方便的是Delphi,Autohotkey能方便的使用Delphi的Gui就好了,自己的GUI貌似太简陋了。
感谢分享, 很有启发