常见问题(FAQ)
语言语法
一般故障排查
- 如果 AutoHotkey 无法安装我该怎么办?
- 为什么我脚本中的某些行总是无法执行?
- 为什么我的脚本在前一个系统运行良好却无法工作于 Windows xxx ?
- 我该如何处理用户账户控制 (UAC) 导致的问题?
- 我想通过托盘图标编辑脚本, 但它只显示一个错误. 能在其他位置找到我的脚本吗?
- 如何查找代码中的错误并修改呢?
- 为什么 Run 命令不能启动我的游戏或程序?
- 为什么在某些游戏中热字串, Send 和 MouseClick 不起作用?
- 如何在玩游戏或平时 CPU 高负荷运行时改善性能?
- 我的杀毒软件把 AHK 归为恶意软件. 它真的含病毒吗?
常见任务
- 我可以在哪里找到官方发行版或更旧的版本?
- 可以在 USB 驱动器中运行 AHK 代码吗?
- 如何获取命令行操作的输出?
- 如何让一个脚本关闭, 暂停或挂起其他的脚本?
- 如何在不退出脚本的情况下停止重复的动作?
- 如何在任意编辑器中获取上下文相关的 AutoHotkey 命令帮助?
- 如何检测一个网页何时加载完毕?
- 如何比较或操作日期与时间?
- 如何发送当前的日期和时间?
- 如何发送文本到不活跃或隐藏的窗口?
- 如何控制 Winamp, 即使在它未激活时?
- 如何改变 MsgBox 的按钮名称?
- 如何改变默认编辑器, 即通过上下文菜单或托盘图标打开的那个?
- 如何保存 GUI 关联变量的内容?
- 如何用 AHK 描绘?
- 如何在窗口出现, 关闭或变成(不)活跃时执行操作?
热键, 热字串和重映射
- 如何让我的热键和热字串在 PC 启动时自动生效?
- 我在把鼠标按钮作为热键使用时遇到问题. 能提供一些建议吗?
- 如何将 tab 和空格设置为热键?
- 如何将按键或鼠标按钮重映射成其他键?
- 如何检测按键或按钮的双击?
- 如何让热键或热字串只在特定的程序中有效? 换句话说, 在特定的窗口不活动时我想让特定的按键执行它原来的功能.
- 如何让前缀按键执行它原来的功能, 而不是什么都不做?
- 如何改变或禁用 Windows 内置的快捷键, 例如 Win+U (辅助工具管理器) 和 Win+R (运行)?
- 如何在热字串中使用通配符或正则表达式?
- 如何使用不存在于我键盘布局中的热键?
- 我的小键盘上有个特殊的 000 键. 可以把它设成热键吗?
语言语法
什么时候需要在命令和它们的参数中使用引号?
双引号 (") 仅在 表达式 中具有特殊的含义. 在其他的所有地方, 它们像普通字符一样被原义对待. 不过, 当脚本启动程序或文档时, 操作系统通常要求要用引号把含空格的命令行参数括起来, 例如:Run, Notepad.exe "C:\My Documents\Address List.txt".
什么时候需要将变量名括在百分号中?
除了下面用 粗体 表示的情况外, 变量名总是要括在百分号中:
1) 在参数中的输入或输出变量: StringLen, OutputVar, InputVar
2) 在赋值表达式的左侧: Var = 123abc
3) 在 传统 (非表达式) if 语句 的左侧: If Var1 < %Var2%
4) 在表达式 中的任意位置. 例如:
If (Var1 <> Var2)
Var1 := Var2 + 100
什么时候应该对百分号和逗号进行 转义?
原义的百分号必须在它们前面加重音符/反引号进行 转义. 例如: MsgBox The current percentage is 25`%. 原义的逗号也必须进行转义 (`,), 除非在 MsgBox 或任何命令的最后一个参数 (在这种情况下可以使用重音符但不是必须的) 使用时.
在 表达式 中逗号或百分号括在引号中时, 可以使用这样重音符但不是必须的. 例如:Var := "15%".
一般故障排查
如果 AutoHotkey 无法安装, 我该怎么办?
7-zip 错误: 用 7-zip 或其他解压缩软件解压安装程序 EXE, 然后运行 setup.exe 或 Installer.ahk (拖拽 Installer.ahk 到 AutoHotkeyU32.exe 上即可).
AutoHotkey 的安装程序(exe 文件)以 7-zip 自解压格式打包, 安装时尝试解压文件到用户的临时文件夹并执行编译的脚本进行安装.有时系统策略或其它原因阻止了文件的解压或执行.通常在遇到这种情况时会显示"7-zip 错误"这样一个消息. 手动解压文件到不同的目录或许能解决该问题.
安装 挂死: 如果安装窗口显示空白或不显示, 尝试下面的解决方案:
- 在安装程序启动时, 按住 Ctrl 或 Shift . 如果出现 UAC 提示, 按住 Ctrl 或 Shift 并点击“是或继续". 你应该能看到询问是否你要以默认选项安装的提示.
- 以命令行选项安装. 如果你手动解压安装程序( Exe 文件), 使用
setup.exe /S或AutoHotkeyU32.exe Installer.ahk /S.
其它: 以上建议基本能解决遇到的大多数问题. 更进一步的援助, 请到论坛发帖求助.
为什么我脚本中的某些行总是无法执行?
任何想在脚本启动时立即执行的行都应该出现在脚本的顶部, 要在首个 热键, 热字串 或 Return 之前. 更多细节请参阅自动执行部分.
还有, 含有多行执行语句的 热键 必须把它的首行写在热键的 下面 而不能在同一行. 例如:
#space:: ; Win+空格键 Run Notepad WinWaitActive Untitled - Notepad WinMaximize return
为什么我的脚本在前一个系统运行良好却无法工作于 Windows xxx?
因为您已经换了操作系统, 很可能某些影响脚本的东西也改变了. 例如, 当您换了新电脑, 那么它和旧电脑有些地方是不一样的. 如果您同时更新了 AutoHotkey 的版本, 那么请看看新版本的更新日志和兼容性提示以找出新旧版本的区别.
- 我已经升级了我的电脑或系统, 现在我的脚本无法工作.
- 当程序以管理员权限运行时, 热键或热字符串不工作.
- 系统阻止自动化操作 (例如 磁盘管理忽略 Send).
当切换操作系统时, 发生的变动也许影响了你的脚本. 例如, 你的新电脑, 可能有不同的驱动或安装了其他的软件. 如果你升级了新版本的 AutoHotkey, 确认你之前使用的是哪个版本并检查更新历史 和 脚本兼容性.
SoundGet, SoundSet, SoundGetWaveVolume and SoundSetWaveVolume 在 Vista 及之后系统的行为不同于早期版本的Windows. 尤其是, 设备的设备号是不同的并且某些组件可能不可用. 依赖于音频驱动程序的行为, 必定与在 XP 时是不同的. 这 声卡分析脚本 能用于找出正确的设备数字.
也请参考以下问题:
我该如何处理用户账户控制 (UAC) 导致的问题?
用户账户控制 (UAC) 是导致问题的常见原因, 特别在系统由 Windows XP/Vista/7 升级到 Vista/7/8/10 时. UAC 存在于Windows Vista 及更后的系统, 在新系统或新安装时默认是被激活的, 并且在 Windows 8 及之后的系统中很难被禁止.
在默认情况下, UAC 保护 "提权" 程序 (程序以管理员权限运行) 不被非提权程序自动化, 因为这将允许他们绕过安全限制. 热键也将被屏蔽, 因此, 非提权程序不能监视用于提权程序的输入.
UAC 也阻止了 SendPlay 和 BlockInput 的正常工作.
常见的解决方案如下:
- 选中激活安装器界面上的增加 'Run with UI Access'(以 UI Access 运行) 到上下文菜单 这个选项. 在开始菜单中运行安装程序, 该选项能被开启或关闭而不用重新安装 AutoHotkey. 该选项开启后, 右键选中的脚本文件选择 Run with UI Access(以 UI Access 运行), 或者使用 命令行 例如
"AutoHotkeyU32_UIA.exe" "要打开的脚本文件名.ahk"(可能需要包括完整路径). - 以管理员权限运行脚本. 注意这样的脚本中运行的任何程序也具有管理员权限.
- 关闭用户账户控制(不推荐), 在 Windows 8 或之后的版本您还必须禁用"以管理员核准模式运行所有管理员(Run all administrators in Admin Approval Mode)"安全设置(也不推荐).
- 完全禁用 UAC. 不推荐这样做, 在 Windows 8 或之后的系统中会导致系统出现一些问题, 例如无法运行 Edge 和应用商店以及其安装的程序.
我想通过托盘图标编辑脚本, 但它只显示一个错误. 能在其他位置找到我的脚本吗?
您必须首先修复您脚本中的错误才能找回AHK的系统托盘图标. 但是首先您必须找到您的脚本.
请在下面的文件夹中寻找 AutoHotkey.ahk 文件:
- 您的 Documents (或 My Documents) 文件夹.
- 安装 AutoHotkey 的文件夹, 默认是 C:\Program Files\AutoHotkey. 如果您使用的不是安装版, 那就去你在使用的 AutoHotkey.exe 的文件夹.
如果您在其他目录中运行AutoHotkey, 脚本名称取决于 AutoHotkey 可执行文件的名称(不一定是 AutoHotkey.exe). 例如, 如果您运行的是 AutoHotkeyU32.exe, 那么请查找 AutoHotkeyU32.ahk. 注意, 有可能您的系统配置为 ".ahk" 是隐藏文件, 但是文件一定有类似这样的图标 ![[H]](ahkfile16.png)
您可以随时从右键菜单中选择 Edit Script 来编辑AHK脚本. 如果这个右键菜单命令无效, 您还可以用记事本或其他文本编辑器来编辑.
如果您是从开始菜单中运行 AutoHotkey 或是直接双击 AutoHotkey.exe 来运行 (不包含任何命令行参数), 那么它会查找上述的脚本来执行. 否则, 您可以在任意位置创建一个其他名称的AHK脚本文件 (something.ahk), 然后运行AHK脚本而不是 AutoHotkey.
另请参阅 命令行参数"Script Filename"和 AutoHotkey.exe 的可移植性.
如何查找代码中的错误并修改呢?
对于简单的脚本, 请参阅调试脚本. 要查看变量的内容, 请使用 MsgBox 或 ToolTip. 对于复杂的脚本, 请参阅交互式调试.
为什么 Run 命令不能启动我的游戏或程序?
有些程序需要在它们自己的目录下运行 (不能确定时, 通常最好这样做). 例如:
Run, %A_ProgramFiles%\Some Application\App.exe, %A_ProgramFiles%\Some Application
如果你想要打开的程序位于 %A_WinDir%\System32 并且你是在 64 位系统中使用 32 位的AutoHotkey, File System Redirector 将会产生干扰. 为避免该问题, 使用 %A_WinDir%\SysNative 代替; 这是一个仅在64位系统上运行的32位程序可见的虚拟目录.
为什么在某些游戏中 热字串, Send 和 Click 不起作用?
一些游戏禁止 AHK 发送键击和点击或获取像素颜色.
有一些替代方法, 请试试下面提及的方案. 如果这些都无效, 那么 AHK 可能不适用于您的游戏. 一些游戏含有防止反破解和作弊的措施, 如 GameGuard 和 Hackshield. 如果是, 则 AutoHotkey 很可能无法用于该游戏.
-
通过 SendPlay 命令,SendMode Play 或 热字串选项 SP 使用 SendPlay.
SendPlay, abc
SendMode, Play Send, abc
:SP:btw::by the way ; or #Hotstring SP ::btw::by the way
注: SendPlay 在启用了用户账户控制的 Windows Vista 或更高版本中可能没有效果, 即使以管理员运行脚本.
-
使用 SetKeyDelay 增加延迟. 例如:
SetKeyDelay, 0, 50 SetKeyDelay, 0, 50, Play
-
试试 ControlSend, 在其他 Send 模式无效时它可能行:
ControlSend,, abc, game_title
-
试试在多种发送方式中使用按键的按下和弹起事件:
Send {KEY down}{KEY up} -
试试在按键的按下事件和弹起事件之间使用 Sleep:
Send {KEY down} Sleep 10 ; 试试不同的毫秒数 Send {KEY Up}
如何在玩游戏或平时 CPU 高负荷运行时改善性能?
如果脚本中的 热键, 鼠标点击, 或 Sends 在 CPU 高负荷运行时明显比正常情况下要慢, 提高脚本程序的优先级或许会有帮助. 要提高脚本进程的优先级, 在脚本开始的部分写入下面的行:
Process, Priority, , High
我的杀毒软件把 AutoHotkey 或编译的脚本程序标记为恶意软件. 它真的含病毒吗?
尽管文件被感染确实是可能的, 但多数情况下这些警报都是误报, 这意味着防病毒程序是错误的. 一个常见的建议是将文件上载到在线服务,例如 virustotal 或 Jotti 看看其他杀毒软件的查杀结果. 如果有疑问, 您可以将该文件发送给您的杀毒软件供应商确认. 这也可能有助于我们和其他AutoHotkey用户, 当供应商确认这是误报和改善他们的产品与AutoHotkey的兼容性.
对于已压缩的编译脚本来说, 误报可能更为常见, 例如使用 UPX (AutoHotkey 1.0 默认, AutoHotkey 1.1 中移除) 或 MPRESS (在AutoHotkey 1.1 中可选).AutoHotkey 安装时不带有压缩程序, 编译脚本时也默认不压缩.
常见任务
我可以在哪里找到官方发行版或更旧的版本?
访问 AutoHotkey 下载页面.
可以在 USB 驱动器中运行 AHK 代码吗 ?
请参阅 AutoHotkey.exe 的可移植性. 需要注意, 如果你使用自动包含的函数库, AutoHotkey.exe 和 Lib 文件夹必须位于 Ahk2Exe.exe 的上一级目录中 (例如 \AutoHotkey.exe 相对 \Compiler\Ahk2Exe.exe). 还需注意 Ahk2Exe 保存设置到注册表的下列键中: HKEY_CURRENT_USER\Software\AutoHotkey\Ahk2Exe.
如何获取命令行操作的输出?
测试表明, 由于文件缓存的原因, 对于较少量的输出, 使用临时文件获取会比较快. 事实上, 如果文件在使用后立即被删除, 通常它并没有被真正地写到磁盘上. 例如:
RunWait %comspec% /c dir > C:\My Temp File.txt FileRead, VarToContainContents, C:\My Temp File.txt FileDelete, C:\My Temp File.txt
要避免使用临时文件 (特别是在输出比较大时), 可以考虑使用 Run 命令示例中展示的 Shell.Exec() 方法.
如何让一个脚本关闭, 暂停或挂起其他的脚本?
首先, 这里有一个关闭其他脚本的例子:
DetectHiddenWindows On ; Allows a script's hidden main window to be detected. SetTitleMatchMode 2 ; Avoids the need to specify the full path of the file below. WinClose Script's File Name.ahk - AutoHotkey ; Update this to reflect the script's name (case sensitive).
其次 suspend (挂起) 或 pause (暂停) 其他脚本, 用下列语句其中一行替换上面脚本的最后一行:
PostMessage, 0x111, 65305,,, Script's File Name.ahk - AutoHotkey ; Suspend. PostMessage, 0x111, 65306,,, Script's File Name.ahk - AutoHotkey ; Pause.
如何在不退出脚本的情况下停止重复的动作?
通过按下热键来暂停或继续整个脚本, 需要给 Pause 命令指定热键, 例如:
^!p::Pause ; Press Ctrl+Alt+P to pause. Press it again to resume.
要停止在 Loop (循环) 中重复的操作, 请参考下面这个可运行示例, 热键启动和停止自身重复动作. 换句话说, 按下热键将开始循环. 再次按下同样的热键将停止循环.
#MaxThreadsPerHotkey 3 #z:: ; Win+Z 热键 (可根据您的喜好改变此热键). #MaxThreadsPerHotkey 1 if KeepWinZRunning ; 这说明一个潜在的 线程 正在下面的循环中运行. { KeepWinZRunning := false ; 向那个线程的循环发出停止的信号. return ; 结束此线程, 这样才可以让下面的线程恢复并得知上一行所做的更改. } ; 否则: KeepWinZRunning := true Loop { ; 以下四行是您要重复的动作 (可根据您的需要修改它们): ToolTip, Press Win-Z again to stop this from flashing. Sleep 1000 ToolTip Sleep 1000 ; 但请不要修改下面剩下的内容. if not KeepWinZRunning ; 用户再次按下 Win-Z 来向循环发出停止的信号. break ; 跳出此循环. } KeepWinZRunning := false ; 复位, 为下一次使用热键做准备. return
如何在任意编辑器中获取上下文相关的 AutoHotkey 命令帮助?
为此 Rajat 创建了 这个脚本.
如何检测一个网页何时加载完毕?
对于 Internet Explorer, 可能最可靠的方法是使用 DllCall 和 COM 正如 www.autohotkey.com/forum/topic19256.html 所演示的. 此外, 获取地址栏及状态栏相关内容的方法在 www.autohotkey.com/forum/topic19255.html 中被提到.
译者注:适用于旧版程序及使用 COM_L, 可能不适用于新版的程序(需修改相关代码才能适用于新版 AutoHotkey)
旧的, 稳定性稍差的方法: 下面示例中的技术对使用 IE 打开大多数网页时都有效. 类似的方法可能也适用于其他浏览器:
Run, www.yahoo.com MouseMove, 0, 0 ; Prevents the status bar from showing a mouse-hover link instead of "Done". WinWait, Yahoo! - WinActivate StatusBarWait, Done, 30 if ErrorLevel MsgBox The wait timed out or the window was closed. else MsgBox The page is done loading.
如何比较或操作日期与时间?
EnvAdd 命令能对 YYYYMMDDHH24MISS 格式表示的时间加上或减去一些天数、小时、分钟或秒. 接下来的示例从指定的时间减去 7 天: EnvAdd, VarContainingTimestamp, -7, days.
要计算两个日期或时间之间的时间量, 请参阅 EnvSub, 中的一个示例. 此外, 内置变量 A_Now 包含了当前本地时间. 最后, 这里有一些内置的 date/time 变量, 也可以使用 FormatTime 命令来创建自定义格式的日期或时间字串.
如何发送当前的日期 和/或 时间?
使用 FormatTime 或 内置的日期和时间的变量.
如何发送文本到不活跃或隐藏的窗口?
使用 ControlSend.
如何控制 Winamp, 即使在它未激活时?
请参阅 让 Winamp 自动化.
如何改变 MsgBox 的按钮名称?
这里有个 例子.
如何改变默认编辑器, 即通过上下文菜单或托盘图标打开的那个?
在 Edit 的示例部分可以找到能让您改变默认编辑器的脚本.
如何保存 GUI 关联变量的内容?
请使用 Gui Submit. 例如:
Gui, Add, Text,, Enter some Text and press Submit: Gui, Add, Edit, vAssociatedVar Gui, Add, Button,, Submit Gui, Show Return ButtonSubmit: Gui, Submit, NoHide MsgBox, Content of the edit control: %AssociatedVar% Return
如何用 AHK 画点什么东西?
请参阅 tic 写的 GDI+ standard library . 它可以通过一些基本方法方法有限的使用 Gui.
如何在窗口出现, 关闭或变成(不)活跃时执行操作?
使用 WinWait,WinWaitClose 或 WinWait[Not]Active.
这里列出了用户自己的解决办法, 例如:OnWin.ahk 和 [How to] Hook on to Shell to receive its messages.
热键, 热字串和重映射
如何让我的热键和热字串在 PC 启动时自动生效?
在开始菜单中有一个 Startup "启动"文件夹. 如果把脚本的快捷方式放到该文件夹, 则对应的脚本会在每次启动电脑时自动运行. 要创建快捷方式:
- 找到脚本文件后选中它, 接着按下 Control-C.
- 右键点击开始按钮 (通常在屏幕的左下角) 并选择 "浏览所有用户".
- 定位到 Programs (程序)文件夹中的 Startup (启动)文件夹.
- 在菜单栏中选择 编辑 -> 粘贴快捷方式. 现在启动文件夹中应该出现了该脚本的快捷方式.
我在把鼠标按钮作为热键使用时遇到问题. 能提供一些建议吗?
鼠标左键和右键应该可以正常设置为热键(例如,#LButton:: 为 Win+LeftButton 热键). 同样地, 鼠标中键和鼠标滚轮的转动应该可以正常地设置为热键, 除非对于驱动直接控制这些按钮的鼠标.
第四个按钮 (XButton1) 和第五个按钮 (XButton2) 也可以设置为热键, 如果您的鼠标驱动让系统可以 看到 这些按键的点击时. 如果它们不可见或您的鼠标除了您使用的五个按钮外还有更多的按钮, 您可以尝试配置鼠标附带的软件 (有时需要通过控制面板或开始菜单访问) 来实现当您按下其中的按钮时发送键击. 然后可以在脚本中把这样的键击设置为热键. 例如, 如果您配置第四个按钮来发送 Control+F1, 然后在脚本中通过使用 ^F1:: 您可以把这个按钮间接的设置为热键.
如果您有五键鼠标, 其中的第四和第五个按钮不 可见, 您可以尝试把鼠标驱动改变为 OS 自带的默认驱动. 这里假设您特殊的鼠标使用自己的驱动并且您不使用鼠标自带软件提供的功能.
如何将 Tab 和空格设置为热键?
使用它们的按键名称 (Tab 和 Space) 而不用它们的字符. 例如, #Space 为 Win+Space 而 ^!Tab 为 Control+Alt+Tab.
如何将按键或鼠标按钮重映射成其他键?
解决的方法在 重映射 页面说明了.
如何检测按键或按钮的双击?
像下面那样使用可用于热键的内置变量:
~Ctrl::
if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
MsgBox double-press
return
如何让 热键 或 热字串 只在特定的程序中有效? 换句话说, 在特定的窗口不活动时我想让特定的按键执行它原来的功能.
首选的方法是使用 #IfWinActive. 例如:
#IfWinActive, ahk_class Notepad ^a::MsgBox You pressed Control-A while Notepad is active.
如何让前缀按键执行它原来的功能, 而不是什么都不做?
请参考下面的例子, 其中把 Numpad0 作为前缀键:
Numpad0 & Numpad1::MsgBox, You pressed Numpad1 while holding down Numpad0.
现在, 要让 Numpad0 在没有像上面那样用来触发热键时发送真正的 Numpad0 键击, 需要添加下面的热键:
$Numpad0::Send, {Numpad0}
使用前缀 $ 是为避免产生关于无效循环的警告对话框 (因为此热键 "发送了它自己"). 此外, 上述动作在 释放 此按键的时候发生.
如何改变或禁用 Windows 内置的快捷键, 例如 Win+U (辅助工具管理器) 和 Win+R (运行)?
这里有一些 例子.
如何在热字串中使用通配符或正则表达式?
使用 polyethene 写的脚本(含示例).
如何使用不存在于我键盘布局中的热键?
请参阅特殊按键.
我的小键盘上有个特殊的 000 键. 可以把它设成热键吗?
是的. 这个 示例脚本 把 000 键设成等号键. 您可以用您想要的语句替换 Send, = 来改变动作.