AutoHotKey

约 2003 字大约 7 分钟...

AutoHotKey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。

符号作用
#Win 键
!Alt 键
^Ctrl 键
+Shift 键
`转义字符,参考转义序列open in new window
;代表注释内容,不影响函数
::(两个英文冒号),代表分隔

注意事项

  • AHK 中不区分大小写,即 run 和 RUN 没有区别。
  • 非热键情况,添加 return,脚本全部停止。
  • 脚本需考虑,你是想要在全局还是局部中激活动作。

常用方法

设置托盘图标

自定义图标可使用 ico 或 png,不支持 svg 格式。

设置命令为 Menu, Tray, Icon , %A_WorkingDir%\dock_panel.png%A_WorkingDir% 代表脚本所在目录。

执行 Powershell

Run, PowerShell.exe -NoExit -Command &{命令}, 目录

问题

隐藏在托盘程序无法监测

WinExist 只能查看签订程序,对于后台或托盘程序,可以用 Process 命令来检查是否存在指定程序的 PID。

;晚上8点停止录屏,并精简视频
if (A_Hour == 20 && Stop_Record ==0){ ;如果小时等于20点
    Stop_Record:=1 ;设置停止录屏变量为1
    Process, Exist, bdcam.exe ;监测隐藏程序
    NewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变, 所以要立即保存这个值.
    if NewPID { ;如果存在录屏工具,则继续
        Send, ^+!{F8} ;晚上8点后,停止录屏
        Sleep, 1000 ;等待5分钟
        ;重命名文件
        FileMove, D:\Backup\Libraries\Desktop\%A_YYYY%-%A_MM%-%A_DD% *-*-*-*.mp4, D:\Backup\Libraries\Desktop\%A_YYYY%-%A_MM%-%A_DD%.mp4
        Sleep, 1000
        ;桌面打开终端,执行 dvr-scan 命令
        Run, PowerShell.exe -NoExit -Command &{dvr-scan -i %A_YYYY%-%A_MM%-%A_DD%.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\Backup\Libraries\Desktop
    }
}

命令中的按键未执行

如果 AutoHotKey 脚本中模拟了按键,窗口中却并未执行,则尝试用管理员权限执行脚本。

低权限的窗口/进程不能发送消息到高权限窗口。比如 Quicker 窗口的权限高,普通启动的 AutoHotKey 脚本无法对 Quicker 输入模拟键,需要管理员权限。

管理员权限运行脚本

如果管理员密码为空,则参考 win10 添加开机启动项管理员权限运行如何设置open in new window,在系统的任务计划程序添加管理员自启动。如果想避免启动报错,建议将启动触发器从「开机」改成「登录」,增加延迟 1 分钟,勾选「最高管理员权限」。设置后,脚本中的打开命令都将使用管理员权限执行。

另一种启动方式,在快捷方式的 属性 - 高级 中勾选「用管理员身份运行」,只能用于手动开启,开机启动会忽略带管理器的启动项。

管理员有设密码,则可使用下列命令,用管理员权限打开脚本。

RunAs, Administrator, PassWD
Run, %A_ScriptDir%\1.ahk
RunAs  ; 恢复为普通权限

常用函数

命令:run, msgbox, send

;run 运行程序或者文档或其他
!n::run notepad ;便捷呼出程序,「notepad」是「运行」对话框中的命令之一,所以不用完整路径
Run, %A_WorkingDir%\xx.lnk ;启用当前目录中的文件
Run, chrome.exe https://newzone.top/ ;指定浏览器打开链接。
Run, %A_ProgramFiles%\Some Application\App.exe, %A_ProgramFiles%\Some Application ;有些程序需要在它们自己的目录下运行。

;Msgbox:显示带两个按钮的对话框 (是 和 否) 对话框中可加内容
Msgbox,你好吗? ;显示「你好吗?」的对话框
;Send:在当前窗口输入文本内容
send how are you? ;在当前窗口输入 how are you?

局部变量:IFwinactive

注意:同样不区分大小写。比如 ifwinactive 等等。

;#IFwinactive(指定窗口)(热键或热字串)
#IFwinactive 新建文本文档.txt - 记事本 ; 在*新建文本文档.txt - 记事本*这个指定窗口下,窗口标题的前半段符合即可
#q:: ;按下 win 键和 q 键
run Notepad ;激活打开记事本这个动作
return

热键、热字串

热键:(按键 1)(按键 2)

当按下特定的按键,或者按键顺序,或者按键组合时,激活某个或者某系列动作。

#q:: ;按下 win 键和 q 键时激活运行记事本这个动作。
run Notepad ;run 为 AHK 中一个命令,相当于 C 语言中的关键字或者说是函数。还有 msgbox 等等。
return ;return 为返回值,在存在多个热键时需使用,不然热键中会起冲突。

q&n:: ;按下 q 和 n,自定义按键:(按键 1)&(按键 2)&...&(按键 n),用来连接任何两个或多个按键组合成一个新的按键。
run notepad ;激活打开记事本这个动作。
return

热字串:(被替换内容)::(替换内容)

扩展或者说自动替换文本,当然也可以映射任何脚本动作。

自动替换:

::hay::how are you? ;当输入 hay 时自动替换为 how are you?
::nh::你好 ;当输入 nh 时自动替换为你好
::/mail::gmail@gmail.com ;键入/mail 后,再加空格、或 tab、或回车,就可以触发缩写
::/fk::轩先生这会子肯定在忙,请骚后。thx。祝君:天天开心,日日欣悦。

热字串映射脚本:

::np::
run Notepad ;当输入 np 加空格时激活运行记事本这个动作。
return
::nh::
send 你好。 ;在当前窗口输入你好。
return
::h:: 欢迎光临! ;只要输入 h,然后回车/TAB/空格就自动把 h 替换为欢迎光临!
:*:w::欢迎你再次光临!     ;自动替换,不需要输入空格来触发替换
::hehe::                 ;替换支持换行文字,需要用括号?
(
老兄!
好久不见!
)

键入热字串后,再加空格、或 tab、或回车,就可以触发缩写。

AHK 使用样例open in new window

神速激活/打开/隐藏程序

Win+C激活 Chrome 状态切换:Chrome 没打开时 --> 打开;打开没激活状态时候 --> 激活;打开处在激活状态时候 ---> 隐藏。

#c::
IfWinNotExist ahk_class Chrome_WidgetWin_1
{
    Run "C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"
    WinActivate
}
Else IfWinNotActive ahk_class Chrome_WidgetWin_1
{
    WinActivate
}
Else
{
    WinMinimize
}
Return

一键运行/关闭脚本的循环

F2一键运行/关闭脚本的循环,空格可暂停/继续脚本。

#maxThreadsPerHotkey, 2 ;让热键能同时有运行/关闭作用,否则键击会被忽略
;setKeyDelay, 50, 50 ;键击默认休眠
;setMouseDelay, 50 ;键击默认休眠
stop:=0

;F2一键运行/关闭脚本的循环
$f2::
    stop:=!stop
    while (stop=1)
    {
        ;激活 excel 窗口「工作簿」获取数值,然后激活 chrome 窗口执行命令,完成后进入循环。
        WinActivate, 工作簿
        Sleep, 333
        Send, {Down}
        Sleep, 100
        Send, {Control Down}{c}{Control Up}
        Sleep, 100
        WinActivate, 捧场 - Google Chrome
        Sleep, 333
        Send, {Control Down}{v}{Control Up}
        Sleep, 100
        Send, {Enter}
        Sleep, 100
    }
return
;如果需要暂停,可在脚本后加这段代码,按 空格键 就暂停,再按空格键继续运行。
;space::pause

监测进程是否运行

监测应用是否有运行,如果没运行则执行启动热键。

Process, Exist, PicGo.exe
NewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变,所以要立即保存值。
if not NewPID
{
    run C:\\Program Files\\PicGo\\PicGo.exe
    sleep 3000
    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}
} else {
    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}
}
return

输入法状态影响字符输出

在脚本中,调用函数SendText()输出文字,不受输入法状态。

;;;;;;;新版独立小程序,可以避免输入法状态影响中文或英文字符的热键输出;;;;;;;
;来源链接:<https://segmentfault.com/a/1190000017029464>
SendText(var_string){
    local
    SendInput {text}%var_string%
    return
}

大写键改为 Enter

;replace CapsLock to LeftEnter; CapsLock = Alt CapsLock
$CapsLock::Enter
LAlt & Capslock::SetCapsLockState, % GetKeyState("CapsLock", "T") ? "Off" : "On"
!u::Send ^c !{tab} ^v
评论
Powered by Waline v2.6.3