之前几篇文章介绍了AHK的入门操作。实际应用时,通常会在同一个脚本中,对不同软件建立不同的快捷键体系,本文将介绍一个非常实用的函数来实现上述功能。
让热键仅在指定软件中有效
之前的示例脚本中,将F1定义为了onenote一级标题样式快捷键,但F1键如此方便好用,我也想在Excel中用它进行重映射,怎么办呢?
虽然你可以选择为每个软件单独写一个脚本,但这样做,管理和运行起来均不方便。实际应用中,一个.ahk脚本可能包含了成百上千行代码,这些代码集成了你打开电脑会经常使用的几乎所有热键功能。例如onenote、Excel等软件中的常用热键,通常是写在一个脚本中,如何让各软件中的快捷键彼此互不影响,并且只在各自的软件窗口才生效呢?
必须先推荐一下这个函数:#IfWinActive,定义在该函数内的热键,会根据软件窗口是否为当前活动窗口,而执行不同的动作。
例如,将之前的那段代码用#IfWinActive包起来,那么此处的F1键对应的动作,只有在当前窗口为onenote时才有效,在其他软件中不会生效。
#IfWinActive, ahk_class Framework::CFrame ;Framework::CFrame即onenote的类名 F1:: Send,^!1 return #IfWinActive
同样地,你可以在同一脚本中,用F1来定义Excel中的显示/隐藏当前单元格的批注。两个F1互不影响,只在各自的软件窗口中有效。
#IfWinActive, ahk_class XLMAIN ;XLMAIN即Excel的类名 F1:: ; 显示/隐藏当前单元格的批注 Send, !rh return #IfWinActive
所以,通过#IfWinActive,你可以将多个软件的热键定义在一个脚本中,彼此互不影响。
如何查看软件的类名
分析一下上面的代码,#IfWinActive是成对出现的,类似于VBA等很多编程语言中的if...endif,可以明确划分出作用域。
第一个#IfWinActive后面跟着参数,代表开始;第一个#IfWinActive后面不带参数,代表结束。就这样成对使用即可。
观察上面的onenote和Excel中的例子,第一个#IfWinActive后面跟着参数Framework::CFrame、XLMAIN分别代表onenote类名、Excel类名,通过这个类名才得以找到指定软件窗口。那么,这个类名从哪儿查看呢?
其实,安装AHK后,程序已经提供了一个非常方便的参考工具“Window Spy”。运行脚本后,可以从托盘AHK图标处右键打开“Window Spy”窗口。
打开窗口后,鼠标点击对应的软件窗口,就会获得该窗口的各种属性信息,例如onenote,第一个窗格内显示的就是onenote的类名、程序名等信息。当鼠标在onenote上移动时,鼠标坐标也会实时变化。
通过“Window Spy”窗口,就可以轻松得到各软件的相关属性信息了,从而可以有针对性的对不同软件设置不同动作。
了解以上知识点后,基本可以参考帮助文档自行编写一些实用脚本了。
公 众 号 :注意两个号的区别,小斯想(OneNote为主);cas01(知识管理理论及实践)。
温馨提示:本站发布的压缩包如需密码解压,若无特别说明,密码统一为:cas01.com
版权声明:本文为原创文章,版权归 小斯 所有,转载请保留出处。
发表于2022-07-29 at 22:52 沙发
从处理「F1」,在Excel中才生效,显示/隐藏当前单元格的批注,实测为Send,!rh1
#IfWinActive, ahk_class XLMAIN ;Excel的类别名为XLMAIN
F1::
Send,!rh1
return
#IfWinActive