如果您的问题没有在后面列出,请查看社区维护的 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
因为您已经换了操作系统,很可能某些影响脚本的东西也改变了。例如,当您换了新电脑,那么它和旧电脑有些地方是不一样的。如果您同时更新了 AutoHotkey 的版本,那么请看看新版本的更新日志和兼容性提示以找出新旧版本的区别。
从 XP 迁移到 Vista 或更高版本的 Windows 的常见问题是热键操作需要较高的权限或拒绝被自动化。至少有三种变通解决方法:
SoundGet、SoundSet、SoundGetWaveVolume 和 SoundSetWaveVolume 的功能在 Vista 及更高版本的 Windows 中比起以前的系统有变化。尤其是设备号不一样了,一些组件也无法使用。具体行为决定于音频驱动,它肯定与 XP 中使用的不同。该声卡分析脚本可用于找到正确的设备号。
试试找到下面的某个文件并编辑(如用记事本):
AHK 的不同版本默认会创建不同的文件,因此请检查所有这些位置,应该只能找到其中某个文件名。
AHK 不是“普通”程序,所以不要期望像其他程序一样从开始菜单运行。从开始菜单运行或直接运行 AutoHotkey.exe 时会读取上面的某个文件并将其作为脚本运行。您应该创建扩展名为 .ahk 的文件并双击它们来运行。
另请参阅命令行参数“Script Filename”和 AutoHotkey.exe 的可移植性。
对于简单的脚本,请参阅调试脚本。要查看变量的内容,请使用 MsgBox 或 ToolTip。对于复杂的脚本,请参阅交互式调试。
请参阅AutoHotkey.exe 的可移植性。需要注意,如果您使用自动包含的函数库,AutoHotkey.exe 和 Lib 文件夹必须在 Ahk2Exe.exe 的上一级目录(例如分别为 \AutoHotkey.exe 和 \Compiler\Ahk2Exe.exe)。还需注意 Ahk2Exe 保存设置到注册表的下列位置: HKEY_CURRENT_USER\Software\AutoHotkey\Ahk2ExeCommand
。
有些程序需要在它们自己的目录下运行 (不能确定时, 通常最好这样做). 例如:
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
要避免使用临时文件 (特别是对于大量输出时), 可以考虑使用 CmdRet 或 StdoutToVar.
首先, 这里有个关闭另一个脚本的例子:
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 高负荷运行时, 如果脚本里的 热键, 点击 或 发送 明显比平时慢, 那么提高脚本的进程优先级可能会有所帮助. 要做到这点, 请在脚本的顶部附近包含下面这行语句:
Process, Priority, , High
为此 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。
一些游戏禁止 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}
请参阅 让 Winamp 自动化.
这里有个 例子.
在 Edit 的示例部分可以找到能让您改变默认编辑器的脚本。
请使用 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
请参阅 tic 写的 GDI+ 标准库。还可以通过一些基本方法但受限的方法使用 Gui。
使用 WinWait、WinWaitClose 或 WinWait[Not]Active。请参阅社区驱动的常见问题(窗口部分)了解更多。
当然不是。杀毒软件可能把 AHK 误识别为恶意软件(称为假阳性(false positive)),原因是脚本在编译时使用了压缩工具,如 UPX(AHK 1.0 的默认设置,在 AHK 1.1 中被移除)或 MPRESS(在 AHK 1.1 中是可选的)。这种压缩工具可以减小编译后可执行文件的大小。如果您不想要压缩,则应该在编译时不使用压缩工具,这样您和其他潜在用户的反病毒程序就不会误报了。
在开始菜单中有一个“启动”文件夹。把脚本的快捷方式放到该文件夹,则对应的脚本会在每次启动电脑时自动运行。要创建快捷方式:
鼠标左键和右键应该可以正常设置为热键(例如,#LButton::
为 Win+LeftButton 热键)。同样地,鼠标中键和鼠标滚轮的转动应该可以正常地设置为热键,除非对于驱动直接控制这些按钮的鼠标。
第四个按钮 (XButton1) 和第五个按钮 (XButton2) 也可以设置为热键, 如果您的鼠标驱动让系统可以 看到 这些按键的点击时. 如果它们不可见或您的鼠标除了您使用的五个按钮外还有更多的按钮, 您可以尝试配置鼠标附带的软件 (有时需要通过控制面板或开始菜单访问) 来实现当您按下其中的按钮时发送键击. 然后可以在脚本中把这样的键击设置为热键. 例如, 如果您配置第四个按钮来发送 Control+F1, 然后在脚本中通过使用 ^F1::
您可以把这个按钮间接的设置为热键.
如果您有五键鼠标, 其中的第四和第五个按钮不 可见, 您可以尝试把鼠标驱动改变为 OS 自带的默认驱动. 这里假设您特殊的鼠标使用自己的驱动并且您不使用鼠标自带软件提供的功能.
使用它们的按键名称 (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}
使用前缀 $ 是为避免产生关于无效循环的警告对话框 (因为此热键 "发送了它自己"). 此外, 上述动作在 释放 此按键的时候发生.
这里有一些 例子.
使用 polyethene 写的脚本(含示例)。
请参阅特殊按键。
是的。这个 示例脚本 把 000 键设成等号键. 您可以用您想要的语句替换 Send, =
来改变动作。