onenote-AHK协同④:同一脚本中的不同软件,建立不同的快捷键体系

原创 小斯  2020-07-24 21:13 

之前几篇文章介绍了AHK的入门操作。实际应用时,通常会在同一个脚本中,对不同软件建立不同的快捷键体系,本文将介绍一个非常实用的函数来实现上述功能。

1

让热键仅在指定软件中有效

之前的示例脚本中,将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,你可以将多个软件的热键定义在一个脚本中,彼此互不影响。

2

如何查看软件的类名

分析一下上面的代码,#IfWinActive是成对出现的,类似于VBA等很多编程语言中的if...endif,可以明确划分出作用域。

第一个#IfWinActive后面跟着参数,代表开始;第一个#IfWinActive后面不带参数,代表结束。就这样成对使用即可。

观察上面的onenote和Excel中的例子,第一个#IfWinActive后面跟着参数Framework::CFrame、XLMAIN分别代表onenote类名、Excel类名,通过这个类名才得以找到指定软件窗口。那么,这个类名从哪儿查看呢?

其实,安装AHK后,程序已经提供了一个非常方便的参考工具“Window Spy”。运行脚本后,可以从托盘AHK图标处右键打开“Window Spy”窗口。

onenote-AHK协同④:同一脚本中的不同软件,建立不同的快捷键体系 onenote 第1张

打开窗口后,鼠标点击对应的软件窗口,就会获得该窗口的各种属性信息,例如onenote,第一个窗格内显示的就是onenote的类名、程序名等信息。当鼠标在onenote上移动时,鼠标坐标也会实时变化。

通过“Window Spy”窗口,就可以轻松得到各软件的相关属性信息了,从而可以有针对性的对不同软件设置不同动作。

onenote-AHK协同④:同一脚本中的不同软件,建立不同的快捷键体系 onenote 第2张

了解以上知识点后,基本可以参考帮助文档自行编写一些实用脚本了。

本文地址:https://cas01.com/5597.html
公 众 号 :注意两个号的区别,小斯想专注于OneNote和思维导图等具体的知识管理软件的经验分享。(OneNote为主);cas01专注于知识管理理论及实践成果的分享。(知识管理理论及实践)。
温馨提示:本站发布的压缩包如需密码解压,若无特别说明,密码统一为:cas01.com
版权声明:本文为原创文章,版权归 小斯 所有,转载请保留出处。

发表评论


表情

  1. yuly
    yuly 【LV3】 @回复

    从处理「F1」,在Excel中才生效,显示/隐藏当前单元格的批注,实测为Send,!rh1
    #IfWinActive, ahk_class XLMAIN ;Excel的类别名为XLMAIN

    F1::
    Send,!rh1
    return

    #IfWinActive