Double quotes (") have special meaning only within expressions. In all other places, they are treated literally as if they were normal characters. However, when a script launches a program or document, the operating system usually requires quotes around any command-line parameter that contains spaces, such as in this example: Run, Notepad.exe "C:\My Documents\Address List.txt"
Variable names are always enclosed in percent signs except in cases illustrated in bold below:
1) In parameters that are input or output variables: StringLen, OutputVar, InputVar
2) On the left side of an assignment: Var = 123abc
3) On the left side of traditional (non-expression) if-statements: If Var1 < %Var2%
4) Everywhere in expressions. For example:
If (Var1 <> Var2)
Var1 := Var2 + 100
Literal percent signs must be escaped by preceding them with an accent/backtick. For example: MsgBox The current percentage is 25`%. Literal commas must also be escaped (`,) except when used in MsgBox or the last parameter of any command (in which case the accent is permitted but not necessary).
When commas or percent signs are enclosed in quotes within an expression, the accent is permitted but not necessary. For example: Var := "15%"
Any lines you want to execute immediately when the script starts should appear at the top of the script, prior to the first hotkey, hotstring, or Return. For details, see auto-execute section.
Also, a hotkey that executes more than one line must list its first line beneath the hotkey, not on the same line. For example:
#space:: ; Win+Spacebar
Run Notepad
WinWaitActive Untitled - Notepad
WinMaximize
return
Some programs need to be started in their own directories (when in doubt, it is usually best to do so). For example:
Run, %A_ProgramFiles%\Some Application\App.exe, %A_ProgramFiles%\Some Application
Testing shows that due to file caching, a temporary file can be very fast for relatively small outputs. In fact, if the file is deleted immediately after use, it often does not actually get written to disk. For example:
RunWait %comspec% /c dir > C:\My Temp File.txt FileRead, VarToContainContents, C:\My Temp File.txt FileDelete, C:\My Temp File.txt
To avoid using a temporary file (especially if the output is large), consider using CmdRet. Alternatively, there is a small freeware utility cb.zip (4 KB) that captures up to 512 KB of output from a command or program. The text is captured to the clipboard, which a script can access via the clipboard variable. For example:
RunWait %comspec% /c dir | cb.exe MsgBox %clipboard%
First, here is an example that closes another script:
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).
To suspend or pause another script, replace the last line above with one of these:
PostMessage, 0x111, 65305,,, Script's File Name.ahk - AutoHotkey ; Suspend. PostMessage, 0x111, 65306,,, Script's File Name.ahk - AutoHotkey ; Pause.
To pause or resume the entire script at the press of a key, assign a hotkey to the Pause command as in this example:
^!p::Pause ; Press Ctrl+Alt+P to pause. Press it again to resume.
To stop an action that is repeating inside a Loop, consider the following working example, which is a hotkey that both starts and stops its own repeating action. In other words, pressing the hotkey once will start the Loop. Pressing the same hotkey again will stop it.
#MaxThreadsPerHotkey 3 #z:: ; Win+Z hotkey (change this hotkey to suit your preferences). #MaxThreadsPerHotkey 1 if KeepWinZRunning ; This means an underlying thread is already running the loop below. { KeepWinZRunning := false ; Signal that thread's loop to stop. return ; End this thread so that the one underneath will resume and see the change made by the line above. } ; Otherwise: KeepWinZRunning := true Loop { ; The next four lines are the action you want to repeat (update them to suit your preferences): ToolTip, Press Win-Z again to stop this from flashing. Sleep 1000 ToolTip Sleep 1000 ; But leave the rest below unchanged. if not KeepWinZRunning ; The user signaled the loop to stop by pressing Win-Z again. break ; Break out of this loop. } KeepWinZRunning := false ; Reset in preparation for the next press of this hotkey. return
If a script's Hotkeys, Clicks, or Sends are noticeably slower than normal while the CPU is under heavy load, raising the script's process-priority may help. To do this, include the following line near the top of the script:
Process, Priority, , High
Rajat created this script.
The technique in the following example will work with MS Internet Explorer for most pages. A similar technique might work in other browsers:
Run, www.yahoo.com
MouseMove, 0, 0 ; Prevents the status bar from showing a mouse-hover link instead of "Done".
WinWait, Yahoo! - Microsoft Internet Explorer
WinActivate
StatusBarWait, Done, 30
if ErrorLevel
MsgBox The wait timed out or the window was closed.
else
MsgBox The page is done loading.
The EnvAdd command can add or subtract a quantity of days, hours, minutes, or seconds to a time-string that is in the YYYYMMDDHH24MISS format. The following example subtracts 7 days from the specified time:
EnvAdd, VarContainingTimestamp, -7, days
To determine the amount of time between two dates or times, see EnvSub, which gives an example. Also, the built-in variable A_Now contains the current local time. Finally, there are several built-in date/time variables, as well as the FormatTime command to create a custom date/time string.
Some games use DirectInput exclusively. As a side-effect, they might ignore all simulated keystrokes and mouse clicks. To work around this, try one of the following (or a combination):
See Automating Winamp.
Here is an example.
There is a folder in the Start Menu called Startup. If you put a shortcut to your script in that folder, the script will launch automatically every time you start your PC. To create a shortcut:
Note that mouse hotkeys are not currently possible on Windows 95/98/Me. On other operating systems, the left and right mouse buttons should be assignable normally (for example, "#LButton::" is the Win+LeftButton hotkey). Similarly, the middle button and the turning of the mouse wheel should be assignable normally except on mice whose drivers directly control those buttons.
The fourth button (XButton1) and the fifth button (XButton2) might be assignable if your mouse driver allows their clicks to be seen by the system. If they cannot be seen -- or if your mouse has more than five buttons -- you can try configuring the software that came with the mouse (sometimes accessible in the Control Panel or Start Menu) to send a keystroke whenever you press one of these buttons. Such a keystroke can then be defined as a hotkey in a script. For example, if you configure the fourth button to send Control+F1, you can then indirectly configure that button as a hotkey by using ^F1:: in a script.
If you have a five-button mouse whose fourth and fifth buttons cannot be seen, you can try changing your mouse driver to the default driver included with the OS. This assumes there is such a driver for your particular mouse and that you can live without the features provided by your mouse's custom software.
Use the names of the keys (Tab and Space) rather than their characters. For example, #Space is Win+Space and ^!Tab is Control+Alt+Tab.
This is described on the remapping page.
The preferred method is #IfWinActive. For example:
#IfWinActive, ahk_class Notepad ^a::MsgBox You pressed Control-A while Notepad is active.
Windows 95/98/Me: Although the above method works, pressing Control-A in a window other than Notepad will do nothing at all (not even its native function). To work around this, use:
$^a::Send ^a ; This hotkey must be listed first on Windows 9x. The $ prefix allows it to "send itself".
#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Control-A while Notepad is active.
Consider the following example, which makes Numpad0 into a prefix key:
Numpad0 & Numpad1::MsgBox, You pressed Numpad1 while holding down Numpad0.
Now, to make Numpad0 send a real Numpad0 keystroke whenever it wasn't used to launch a hotkey such as the above, add the following hotkey:
$Numpad0::Send, {Numpad0}
The $ prefix is needed to prevent a warning dialog about an infinite loop (since the hotkey "sends itself"). In addition, the above action occurs at the time the key is released.
Here are some examples.
You can, but only if you're running Windows NT, 2000, XP, or beyond. This example script makes the 000 key into an equals key. You can change the action by replacing the "Send, =" line with line(s) of your choice.