常见问题(FAQ)

如果您的问题没有在后面列出,请查看社区维护的 autoHotkey.net 上的 FAQ

语言语法

常见任务

热键, 热字串和重映射

语言语法

什么时候需要在命令和它们的参数中使用引号?

双引号 (") 仅在 表达式 中具有特殊的含义. 在其他的所有地方, 它们像普通字符一样被原义对待. 不过,当脚本启动程序或文档时,操作系统通常要求要用引号把含空格的命令行参数括起来,例如: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 的下载页面

为什么我脚本中的某些行总是无法执行?

任何想在脚本启动时立即执行的行都应该出现在脚本的顶部, 要在首个 热键, 热字串Return 之前. 更多细节请参阅自动执行部分

还有, 含有多行执行语句的 热键 必须把它的首行写在热键的 下面 而不能在同一行. 例如:

#space::  ; Win+空格键
Run Notepad
WinWaitActive Untitled - Notepad
WinMaximize
return

为什么我的脚本在 XP 运行良好却无法工作于 Windows 7 或 8?

因为您已经换了操作系统,很可能某些影响脚本的东西也改变了。例如,当您换了新电脑,那么它和旧电脑有些地方是不一样的。如果您同时更新了 AutoHotkey 的版本,那么请看看新版本的更新日志兼容性提示以找出新旧版本的区别。

从 XP 迁移到 Vista 或更高版本的 Windows 的常见问题是热键操作需要较高的权限或拒绝被自动化。至少有三种变通解决方法:

SoundGetSoundSetSoundGetWaveVolumeSoundSetWaveVolume 的功能在 Vista 及更高版本的 Windows 中比起以前的系统有变化。尤其是设备号不一样了,一些组件也无法使用。具体行为决定于音频驱动,它肯定与 XP 中使用的不同。该声卡分析脚本可用于找到正确的设备号。

我想通过托盘图标编辑脚本,但它只显示一个错误。能在其他位置找到我的脚本吗?

试试找到下面的某个文件并编辑(如用记事本):

AHK 的不同版本默认会创建不同的文件,因此请检查所有这些位置,应该只能找到其中某个文件名。

AHK 不是“普通”程序,所以不要期望像其他程序一样从开始菜单运行。从开始菜单运行或直接运行 AutoHotkey.exe 时会读取上面的某个文件并将其作为脚本运行。您应该创建扩展名为 .ahk 的文件并双击它们来运行。

另请参阅命令行参数“Script Filename”AutoHotkey.exe 的可移植性

如何查找代码中的错误并修改呢?

对于简单的脚本,请参阅调试脚本。要查看变量的内容,请使用 MsgBoxToolTip。对于复杂的脚本,请参阅交互式调试

可以在 USB 驱动器中运行 AHK 代码吗?

请参阅AutoHotkey.exe 的可移植性。需要注意,如果您使用自动包含的函数库,AutoHotkey.exe 和 Lib 文件夹必须在 Ahk2Exe.exe 的上一级目录(例如分别为 \AutoHotkey.exe 和 \Compiler\Ahk2Exe.exe)。还需注意 Ahk2Exe 保存设置到注册表的下列位置: HKEY_CURRENT_USER\Software\AutoHotkey\Ahk2ExeCommand

为什么 Run 命令不能启动我的游戏或程序?

有些程序需要在它们自己的目录下运行 (不能确定时, 通常最好这样做). 例如:

Run, %A_ProgramFiles%\Some Application\App.exe, %A_ProgramFiles%\Some Application

如何获取命令行操作的输出?

测试显示, 由于文件缓存的原因, 对于较少量的输出, 使用临时文件获取会非常快. 事实上, 如果在使用后立即删除文件, 通常它并没有被真正地写到磁盘上. 例如:

RunWait %comspec% /c dir > C:\My Temp File.txt
FileRead, VarToContainContents, C:\My Temp File.txt
FileDelete, C:\My Temp File.txt

要避免使用临时文件 (特别是对于大量输出时), 可以考虑使用 CmdRetStdoutToVar.

如何让一个脚本关闭, 暂停或挂起其他的脚本?

首先, 这里有个关闭另一个脚本的例子:

DetectHiddenWindows On  ; 才可以检测到脚本的隐藏主窗口.
SetTitleMatchMode 2  ; 避免为下面的文件指定完整的路径.
WinClose Script's File Name.ahk - AutoHotkey  ; 根据脚本的名称 (区分大小写) 更新此语句.

挂起暂停 另一个脚本, 请把上面脚本的最后一行替换为下列语句中的一个:

PostMessage, 0x111, 65305,,, Script's File Name.ahk - AutoHotkey  ; 挂起.
PostMessage, 0x111, 65306,,, Script's File Name.ahk - AutoHotkey  ; 暂停.

如何在不退出脚本的情况下停止重复的动作?

要通过按键来暂停或恢复整个脚本, 需要给 Pause 命令指定热键, 例如:

^!p::Pause  ; 按 Ctrl+Alt+P 暂停. 再按一次则恢复.

要停止在 循环 中重复的动作, 请参考下面这个可运行示例, 这是一个可以启用和停止它自身重复动作的热键. 换句话说, 按一次这个热键将开始循环. 再按同样的热键将停止循环.

#MaxThreadsPerHotkey 3
#z::  ; Win+Z 热键 (可根据您的喜好改变此热键).
#MaxThreadsPerHotkey 1
if KeepWinZRunning  ; 这说明一个潜在的 线程 正在下面的循环中运行.
{
    KeepWinZRunning := false  ; 向那个线程的循环发出停止的信号.
    return  ; 结束此线程, 这样才可以让下面的线程恢复并得知上一行所做的更改.
}
; 否则:
KeepWinZRunning := true
Loop
{
    ; 以下四行是您要重复的动作 (可根据您的需要修改它们):
    ToolTip, 再次按下 Win-Z 来停止此提示闪动.
    Sleep 1000
    ToolTip
    Sleep 1000
    ; 但请不要修改下面剩下的内容.
    if not KeepWinZRunning  ; 用户再次按下 Win-Z 来向循环发出停止的信号.
        break  ; 跳出此循环.
}
KeepWinZRunning := false  ; 复位, 为下一次使用热键做准备.
return

如何在玩游戏或平时 CPU 高负荷运行时改善性能?

当 CPU 高负荷运行时, 如果脚本里的 热键, 点击发送 明显比平时慢, 那么提高脚本的进程优先级可能会有所帮助. 要做到这点, 请在脚本的顶部附近包含下面这行语句:

Process, Priority, , High

如何在任意编辑器中使用上下文相关的 AutoHotkey 命令帮助?

为此 Rajat 创建了 此脚本.

如何检测一个网页何时加载完毕?

对于 Internet Explorer, 可能最可靠的方法是使用 DllCall 和 COM, 正如 www.autohotkey.com/forum/topic19256.html 所演示的. 相关提示, 通过 www.autohotkey.com/forum/topic19255.html 演示的方法可以获取地址栏和状态栏的内容.

旧的、较不可靠的方法:下面示例中的技术对使用 MS Internet Explorer 打开大部分页面时都有效。类似的技术对于其他的浏览器可能也有效:

Run, www.yahoo.com
MouseMove, 0, 0  ; 防止状态栏显示鼠标悬停处的链接而不显示 "完毕".
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 包含了当前的本地时间. 最后, 还有许多内置的 日期/时间变量, 以及用来创建自定义日期/时间字符串的 FormatTime 命令.

如何发送当前的日期和时间?

使用 FormatTime内置的日期和时间变量

如何发送文本到不活跃或隐藏的窗口?

使用 ControlSend

为什么在某些游戏中 热字串, SendClick 不起作用?

一些游戏禁止 AHK 发送键击和点击或获取像素颜色。

有一些替代方法,请试试下面提及的方案。如果这些都无效,那么 AHK 可能不适用于您的游戏。一些游戏含有防止反破解和作弊的措施,如 GameGuard 和 Hackshield。如果是,则 AutoHotkey 很可能无法用于该游戏。

如何控制 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+ 标准库。还可以通过一些基本方法但受限的方法使用 Gui。

如何在窗口出现、关闭或变成(不)活跃时执行操作?

使用 WinWaitWinWaitCloseWinWait[Not]Active。请参阅社区驱动的常见问题(窗口部分)了解更多。

我的杀毒软件把 AHK 归为恶意软件。它真的含病毒吗?

当然不是。杀毒软件可能把 AHK 误识别为恶意软件(称为假阳性(false positive)),原因是脚本在编译时使用了压缩工具,如 UPX(AHK 1.0 的默认设置,在 AHK 1.1 中被移除)或 MPRESS(在 AHK 1.1 中是可选的)。这种压缩工具可以减小编译后可执行文件的大小。如果您不想要压缩,则应该在编译时不使用压缩工具,这样您和其他潜在用户的反病毒程序就不会误报了。

热键, 热字串和重映射

如何让我的热键和热字串在 PC 启动时自动生效?

在开始菜单中有一个“启动”文件夹。把脚本的快捷方式放到该文件夹,则对应的脚本会在每次启动电脑时自动运行。要创建快捷方式:

  1. 找到脚本文件后选中它, 接着按下 Control-C.
  2. 右键点击开始按钮 (通常在屏幕的左下角) 并选择 "浏览所有用户".
  3. 定位到程序文件夹中的启动文件夹.
  4. 在菜单栏中选择编辑->粘贴快捷方式。现在启动文件夹中应该出现了该脚本的快捷方式。

我在把鼠标按钮作为热键使用时遇到问题. 能提供一些建议吗?

鼠标左键和右键应该可以正常设置为热键(例如,#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, = 来改变动作。