效率工具AutoHotkey的使用

AutoHotkey是面向普通电脑用户的自由开源的自动化软件工具,它让用户能够快捷或自动执行重复性任务

通过热键或热字串触发是AutoHotkey脚本中执行操作最常见的两种方式,它们都很容易编写且使用方便,因此快捷高效。

AutoHotkey能快速实现的常见功能包括:

  • 重映射键盘按键、鼠标和游戏杆的按钮;
  • 发送键击及鼠标和操纵杆的点击几乎可自动化所有操作;
  • 启动程序或文档,操作与控制其他程序的窗口;
  • 处理字符串,支持正则表达式;
  • 操作文件和文件夹、注册表和INI文件;
  • 设置静音,调节音量和声卡的其他设置;
  • 创建自定义图形用户界面程序,从用户或文件中获取输入;
  • 监视系统,当某些状态改变时自动响应;
  • 通过检测图像和像素颜色来自动操作游戏,以减缓肢体重复性劳损;

上面引用wiki的内容,比较抽象,下面进行举例:

例子

场景1

开机之后,你想启动sublime。你要移动鼠标到sublime图标上双击打开。
有了AutoHotkey,可以直接定义一个快捷键,比如Alt+b就运行sublime。

场景2

你在浏览器上看文档,现在要切换到sublime上写东西。
普通人可能会用Alt+Tab进行切换或者用鼠标点击到sublime上。
有了AutoHotkey,可以直接定义一个快捷键,比如Alt+b就可以让sublime变为前置窗口,进行编辑。

相当于无论sublime有没有启动,你想编辑文本,按下Alt+b,sublime就在最前面,然后可以愉快的写东西。
而这一切都只要简单的配置,如下面脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
; Sublime
!b::
winclass := "PX_WINDOW_CLASS"
path := "C:\Program Files\Sublime Text 3\sublime_text.exe"
If WinExist("ahk_class "+windclass)
{
WinActivate
; WinMaximize
}
else
{
run %path%
}
return

其实如果就这一点点,感觉也没很大的作用。
但如果有了规模效应,把你常用的软件都绑上快捷键。
你可以就直接用快捷键来多个窗口切换,基本上不用鼠标。

场景3

用ssh连上远程机器时,管理员权限是要输入密码。因为安全考虑,密码是没有规律而且很长。每次都要从文本上复制出来,再粘贴。
这样就可以用AutoHotkey定义一个快捷键,按下快捷键就粘贴密码。一下省了很多重复操作。

比如我自己的数据库连接的密码,常用测试账号的密码都设置了这样的快捷键。

1
2
3
!F10::
send WrGw4XjTYQy3r7d9DRur
return

(当然Ditto,专门管理剪贴板的工具,可以替代这一功能)

场景4

在一些非vim编辑器中,想像vim 一样,可临时的用hjkl来移动光标。

就可以写下面的脚本这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
; 增加全局的vim方向键
!l::
Send {Right}
return
!k::
Send {Up}
return
!j::
Send {Down}
return
!h::
Send {Left}
return

场景5

我平时经常要用把文件路径复制到程序中。
在windows下复制的路径分隔符都是\,但\在程序中是转义字符。
所以每次复制后,都要把\改为\\/
有了AutoHotkey,可以直接定义一个快捷键,把剪贴板中的内容进行替换,把\替换成/
这样我复制路径后,按下快捷键后,再粘贴,路径就是正常的了。
如下面的脚本

1
2
3
!\::
StringReplace, clipboard, clipboard, \, /, All
return

场景6

在win7下,总是通过win+方向键来让窗口占左半屏或者右半屏。
但在win10下,win+方向键后,总要人去鼠标选一下另一半的窗口,这样就打断了节奏。
于是可以自己把重写上面的快捷键使实现功能。

1
2
3
4
5
6
7
8
9
10
11
12
#Right::
WinGetActiveTitle, OutputVar
WinMove,%OutputVar%,, 960, 30 ,960,1050
return
#Left::
WinGetActiveTitle, OutputVar
WinMove,%OutputVar%,,0, 30 ,960,1050
return
#Up::
WinGetActiveTitle, OutputVar
WinMove,%OutputVar%,,0, 30 ,1920,1050
return

场景7

场景2的扩展。
比如我打开了多个控制台窗口,我自己定义的是alt+c来激活cmd窗口。
但我想在这几个中切换,就要鼠标移动到任务栏上去选了,打断节奏。
前段时间,在读文档时发现 group系系的 api,像发现一个宝藏一样。
按一下激活cmd窗口,再按一下激活到下一个cmd窗口,非常实用

1
2
3
4
5
; 切换多命令行窗口
#c::
GroupAdd, CONSOLE_WINDOW, ahk_class ConsoleWindowClass
GroupActivate, CONSOLE_WINDOW
return

扩展下,浏览器,sublime,资源管理器,都可以这样

场景8

win10上,因为一些原因,装不Listary。所以不能像在在listary的时候那样,在资源管理器中打开命令。
但我在资源管理器当前目录打开cmd窗口的操作又很多,比如打包编译。
于是我定义一个从当前目录打开cmd,并在cmd中切换到该目录的命令。
实现这个有个困难,怎么用autohotkey的api,拿到资源管理器当前目录。
一段时间来没有想到解决办法,直到突然有一天,在AU3_Spy.exe的下几行中看到了这个路径。
然后发现子控件的文本也会分行来显示。最后通过GetWindowText,加上spit,加正则表式,把这个路径提取出来了。
再就是怎么把cmd切换到这个指定目录。cmd不像别的命令,输-h,可以给参数之类的。于是用了一个取巧的办法。
win10的资源管理器文件菜单下会有一个打开cmd窗口的子菜单(有的版本只有打开powershell)
打开之后,打开任务管理器,在命令行这一列可以看到打开命令,按这个格式,run 后面加这个命令就可以实现了。

场景9

有时候不知不觉会打开很多资源管理器窗口。按场景7中的方法一个一个切,会切很多次。
如能把这些窗口按规则列出来就好了。
于是还真找到相关的api实现了。用WinGet,拿到符合条件的所有窗口列表。
循环遍历,用WinMove调整位置,再进行激活。可以按顺序列出窗口了。

1
2
3
4
5
6
7
8
9
10
11
12
13
#2::
WinGet, OutputVar, List , ahk_class CabinetWClass
Loop %OutputVar%
{
element :=OutputVar%A_Index%
;MsgBox %element%
newX := A_Index * 27
newY := A_Index * 27 + 35
WinActivate,ahk_id %element%
WinMove, ahk_id %element%, ,%newX%, %newY%
WinActivate,ahk_id %element%
}
return

AutoHotkey 的使用方法

AutoHotkey.exe <脚本文件>
现在新的版本可能对这方面进行了优化。

AutoHotkey 脚本语法

这里有份中文版的说明
http://ahkcn.sourceforge.net/docs/Tutorial.htm

常用的

  • # - win
  • ^ - Ctrl
  • ! - Alt
  • MsgBox "1" - 消息框
  • InputBox cmd ,,,,200,100 - 输入框示例
  • If WinExist("ahk_class OpusApp") - 判断窗口类名为OpusApp的窗口是否存
  • WinActivate - 激活窗口
  • Run - 运行命令
  • %clipboard% - 变量内容

关于窗口操作,autohotkey有丰富的api,上次把文档重新翻了下之后,的确也发现很多新东西。
基本上可以满住日常所用。
看了下别人的示例脚本,把调DLL拿windows api的操作都出来了,的确扩展挺强。

WinTitle 参数

这个参数是后面windows操作的基础,像windows api中的句柄概念一样。
文档上是这写的

1
2
3
4
5
6
7
8
Title	Matching Behaviour
A The Active Window
ahk_class Window Class
ahk_id Unique ID/HWND
ahk_pid Process ID
ahk_exe Process Name/Path
ahk_group Window Group
(All empty) Last Found Window

用得多的就是ahk_class Window Class,通过窗口类别定位类。

这种调用方式,有点像前面是指令类型,后面是指令参数。
可以通过 进程名,id,及进程文件路径,也是很全面了。

其它工具

在写脚本的时候,常要判断窗口类名,标题之类的。
现在新版直接自带AU3_Spy.exe激活窗口信息查看器。
在没有这个的时候
自己是用的vs下面自带的工具spy.exe
还有vcPython自带的UISpy.exe

更多

https://sourceforge.net/projects/ahkcn/
https://autohotkey.com/
https://autohotkey.com/docs/AutoHotkey.htm
https://zh.wikipedia.org/zh-hans/AutoHotkey