Ahk之单键热键思路与运用详解

一直想着将自己学习使用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日

 

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

Autohotkey调用彩云小译 API实现全过程

2022-10-11 16:29:02

AHKV1案例

打开最新文件所在的文件夹

2022-12-13 8:55:13

4 条回复 A文章作者 M管理员
  1. user16961

    感谢分享,我也喜欢单键热键,确实最主要的问题就是记不住,所以我想用个Gui做个帮助窗口来解决这个问题,但是Gui最方便的是Delphi,Autohotkey能方便的使用Delphi的Gui就好了,自己的GUI貌似太简陋了。

  2. 五分钟

    感谢分享

  3. 11010010
    11010010给您捐赠了¥2
个人中心
今日签到
有新私信 私信列表
搜索