Tutorial para iniciantes, por tidbit

Sumário

  1. Primeiros passos
    1. Baixando e instalando o AutoHotkey
    2. Como criar um script
    3. Você não pode mesclar comandos
    4. Como encontrar o arquivo da ajuda em seu computador
  2. Hotkeys e hotstrings
    1. As teclas e seus misteriosos símbolos
    2. Hotkeys e hotstrings que funcionam em só em uma ou algumas janelas
    3. Múltiplas hotkeys e hotstrings num mesmo arquivo
    4. Exemplos
  3. Enviando pressionamentos de teclas
    1. Jogos
  4. Executando programas e abrindo sites da web
  5. Comandos x funções()
    1. Blocos de código
  6. Variáveis
    1. Quando usar o símbolo de porcentagem
    2. Recebendo entrada do usuário
    3. Outros exemplos?
  7. Objetos
    1. Criando objetos
    2. Usando objetos
  8. Outras utilidades
    1. Os misteriosos colchetes
    2. Determinando a versão de seu AHK
    3. Tentativa e erro
    4. Indentação
    5. Pedindo ajuda
    6. Outros links

1 - Primeiros passos

Antes de começarmos nossa jornada, deixe-me te dar um conselho. Ao longo deste tutorial você verá muito texto e muito código. Para otimizar seu poder de aprendizado, recomenda-se que você leia o texto e teste o código. Em seguida, estude o código. Você pode copiar e colar a maioria dos exemplos desta página. Se ficar confuso, tente reler a seção.

a. Baixando e instalando o AutoHotkey

Antes de aprender a usar o AutoHotkey (AHK), você precisa baixá-lo. Depois de fazer o download, você provavelmente terá que instalá-lo em seguida, mas isso dependerá da versão que você quer. Para este guia, vamos usar o instalador, já que é a forma mais fácil.

Instruções em texto:

  1. Vá ao site do AutoHotkey: https://www.autohotkey.com/
  2. Clique em Download: https://www.autohotkey.com/download/ahk-install.exe
  3. Durante a instalação do AutoHotkey, você será perguntado se quer usar a codificação UNICODE ou ANSI. Em resumo, você provavelmente quererá escolher UNICODE. Essa codificação tem suporte para letras e números de outras línguas além do inglês (caracteres). Prossiga até você ver um botão 'Install'.
  4. Feito isso, ótimo! Continue para a seção b.

Para instruções em vídeo, assista Instalar e Hello World no YouTube (em inglês).

b. Como criar um script

Instalado o AutoHotkey, você agora quer que ele faça coisas para você. O AHK não é mágica; nós todos queríamos que fosse, mas não é. Então nós precisamos dizer a ele o que fazer. Esse processo é chamado “scripting” ou “desenvolvimento de scripts”.

Instruções em texto:

  1. Clique com o botão direito na sua área de trabalho.
  2. Encontre “Novo” no menu.
  3. Clique em “AutoHotkey Script” dentro do menu “Novo”.
  4. Dê um nome novo ao script. Ele deve terminar com a extensão .ahk. Por exemplo: MeuScript.ahk
  5. Encontre o arquivo recém-criado em sua área de trabalho e clique com o botão direito nele.
  6. Clique em “Edit Script”.
  7. Uma janela deve abrir, provavelmente o Bloco de Notas. Se abriu, SUCESSO!

    Então agora que você criou um script, temos que adicionar algumas linhas ao arquivo. Para uma lista de comandos, funções e variáveis nativos, veja a seção 5.

    Eis um script bem básico contendo uma tecla de atalho que faz o programa digitar texto usando o comando Send quando a tecla de atalho é pressionada: (NdT: daqui em diante, a expressão “tecla de atalho” será substituída por “hotkey”, para melhor combinar com a identidade do programa.)

    ^j::
    Send, Meu primeiro script
    return

    Vamos nos aprofundar mais tarde. Até lá, aqui está uma explicação do código acima:

  8. Salve o arquivo.
  9. Dê um duplo clique no arquivo/ícone na área de trabalho para executá-lo. Abra o Bloco de Notas ou (qualquer janela em que você possa digitar texto) e pressione Ctrl e J.
  10. Woohoo! Seu primeiro script está pronto. Agora vá buscar um lanchinho como recompensa e volte para ler o resto deste tutorial.

Para instruções em vídeo, assista Instalar e Hello World no YouTube (em inglês).

c. Você não pode mesclar comandos

Quando você está montando seu código, você pode ficar com vontade de inserir vários comandos na mesma linha ou dentro um do outro. Não faça isso. Na seção 5 vamos falar sobre o porquê de não funcionar do jeito que você espera e o que você pode fazer para consertar.

d. Como encontrar o arquivo da ajuda em seu computador

Há alguns jeitos de fazer isso; vou assumir que instalou o programa no local padrão:

Método 1:

  1. Vá ao menu iniciar, normalmente no canto inferior esquerdo de sua tela.
  2. Clique em Programas ou Todos os programas.
  3. Ache AutoHotkey na lista.
  4. Aí você deverá ver o Arquivo de ajuda do AutoHotkey (AutoHotkey help file). Clique nele.
  5. Pronto!

Método 2:

  1. Vá para sua área de trabalho.
  2. Encontre Meu computador ou Computador. Abra-o.
  3. Vá ao disco rígido ou partição que contém o AutoHotkey. Provavelmente o drive C:\.
  4. Procure dentro de todos as pastas de Arquivos de programas pelo AutoHotkey.
  5. Encontre o arquivo AutoHotkey.chm ou um arquivo em que esteja escrito “AutoHotkey” e tenha um ponto de interrogação amarelo.
  6. Pronto!

2 - Hotkeys e Hotstrings

O que é uma hotkey (tecla de atalho)? Uma hotkey é uma tecla que queima o dedo quando você a aperta ... brincadeirinha. É a tecla ou combinação de teclas que a pessoa diante do teclado pressiona para desencadear (executar) algumas ações. Por exemplo:

^j::
Send, Meu primeiro script
return

O que é uma hotstring? As hotstrings são usadas precipuamente para expandir abreviaturas à medida que você as digita (substituição automática). Elas também podem ser usadas para executar qualquer ação que seja parte de seu script. Por exemplo:

::sab::Salve as baleias

A diferença entre os dois exemplos é que a hotkey será desencadeada quando você pressionar Ctrl+J, ao passo que a hotstring converterá sua expressão digitada “sab” em “Salve as baleias”.

“Ok, então como uma pessoa como eu cria uma hotkey?” Boa pergunta. Uma hotkey é criada usando-se um único par do sinal de dois-pontos. A tecla ou combinação de teclas deve aparecer à esquerda dos ::. E o conteúdo deve vir embaixo, seguido de um return.

Nota: Há exceções, mas elas várias vezes tendem a causar confusão. Então não vamos tratar das exceções neste tutorial, pelo menos não agora.

Esc::
MsgBox, Escape!!!!
return

Uma hotstring tem um par de dois-pontos em cada lado do texto que você deseja substituir (a abreviatura). Já o texto que substituirá sua abreviatura digitada deve vir à direita do segundo par de dois-pontos.

Hotstrings, como já dito acima, pode também executar ações do seu script. Essa é uma maneira pomposa de dizer “fazer praticamente qualquer coisa”. O mesmo para as hotkeys.

::tdb::
MsgBox, Você digitou "tdb".
return

Uma coisa legal de se saber é que você pode ter várias linhas de código para cada hotkey, para cada rótulo e para um bando de outras coisas de que não falamos ainda.

^j::
MsgBox, Uau!
MsgBox, Aqui tem
Run, notepad.exe
WinActivate, Sem título - Bloco de Notas
WinWaitActive, Sem título - Bloco de Notas
Send, 7 linhas!{!}{Enter}
SendInput, dentro da hotkey Ctrl{+}J.
return

a. As teclas e seus misteriosos símbolos

Você deve estar pensando “Mas como eu vou saber que ^ significa Ctrl?!” Então... boa pergunta. Para ajudá-lo a aprender o que ^ e outros símbolos significa, observe esta tabela:

Símbolo Descrição
# Win (Tecla do logo do Windows)
! Alt
^ Ctrl
+ Shift
& O símbolo “&” pode ser usado entre quaisquer duas teclas ou botões do mouse para combiná-los e formar uma hotkey personalizada.

(Para a lista completa de símbolos, veja a página sobre Hotkeys.)

Mais que isso, para ver uma lista com todos/quase todos nomes de hotkeys que podem ser usadas no lado esquerdo do sinal duplo de dois-pontos da hotkey, veja Lista de Teclas, Botões do Mouse e Controle do Joystick (por enquanto em inglês).

Você pode definir uma combinação personalizada de duas (e somente duas) teclas (exceto botões de joystick) usando & entre elas. No exemplo abaixo, você segura a tecla Numpad0 e em seguida pressiona Numpad1 ou Numpad2 para desencadear uma das hotkeys:

Numpad0 & Numpad1::
MsgBox, Você pressionou Numpad1 enquanto segurava Numpad0.
return

Numpad0 & Numpad2::
Run, notepad.exe
return

Mas agora você está se perguntando se as hotstrings têm modificadores maneiros iguais aos das hotkeys. Sim, elas têm! Modificadores de hotstrings vão no meio do primeiro par de dois-pontos: Por exemplo:

:*:slm::Salve os leões marinhos

Visite Hotkeys e Hotstrings para modificadores, informações e exemplos adicionais.

b. Hotkeys e hotstrings que funcionam em só em uma ou algumas janelas

Às vezes você pode querer que uma hotkey ou hotstring só funcione (ou fique desabilitada) em uma determinada janela. Para fazer isso, você precisará usar um destes comandos garbosos com um símbolo # na frente deles:

#IfWinActive
#IfWinExist

Esses comandos especiais (tecnicamente chamados de “diretivas”) criam hotkeys e hotstrings sensíveis ao contexto. Simplesmente especifique um título de janela. Mas, em alguns casos, você pode querer especificar algum critério como HWND, grupo ou classe. Esses critérios são um pouco avançados e são cobertos em maior profundidade aqui: O parâmetro WinTitle & a Última Janela Encontrada.

#IfWinActive Sem título - Bloco de Notas
#Space::
MsgBox, Você pressionou Win+Espaço no Bloco de Notas.
return

Para desabilitar a “sensibilidade ao contexto” para as hotkeys e hotstrings subsequentes, especifique qualquer diretiva #IfWin mas deixe todos seus parâmetros em branco. Por exemplo:

; Sem título - Bloco de Notas
#IfWinActive Sem título - Bloco de Notas
!q::
MsgBox, Você pressionou Alt+Q dentro do Bloco de Notas.
return

; Qualquer janela que não seja "Sem título - Bloco de Notas"
#IfWinActive
!q::
MsgBox, Você pressionou Alt+Q em alguma outra janela.
return

Quando as diretivas #IfWin não são usadas em nenhum lugar do script, então todas as hotkeys e hotstrings funcionarão em todas as janelas.

As diretivas #IfWin são posicionais: elas afetam todas as hotkeys e hotstrings fisicamente abaixo delas no script. Elas também são mutuamente excludentes; isto é, somente a mais recente terá efeito.

; Bloco de Notas
#IfWinActive ahk_class Notepad
#Space::
MsgBox, Você pressionou Win+Espaço no Bloco de Notas.
return
::msg::Você digitou "msg" dentro do Bloco de Notas.

; MSPaint
#IfWinActive Sem título - Paint
#Space::
MsgBox, Você pressionou Win+Espaço no Paint!
return
::msg::Você digitou "msg" dentro do Paint!

Para informações mais detalhadas e comandos similares, confira a página #IfWinActive.

c. Múltiplas hotkeys e hotstrings num mesmo arquivo

Esta ideia, por alguma razão, passa pela cabeça de alguns. Então vou deixar claro: O AutoHotkey permite que você adicione o número que você quiser de hotkeys e hotstrings. Sejam uma ou 3253.

#i::
Run, https://www.google.com/
return

^p::
Run, notepad.exe
return

~h::
Send, enrique
return

:*:trnasf::transf
:*:todso::todos
::brasil::Brasil
::cjg::coisa julgada
::cgj::coisa julgada
::xplo::exploração
:*:fazelo::fazê-lo
::mesom::mesmo

O código acima é perfeitamente aceitável. Múltiplas hotkeys, múltiplas hotstrings. Tudo em um único arquivo de script grande e feliz.

d. Exemplos

::flni::falando nisso  ; Substitui “btw” por “by the way” assim que você pressionar o caractere de terminação padrão.
:*:btw::by the way  ; Substitui “btw” por “by the way” sem que você precise pressionar um caractere de terminação, ou seja, tão logo você pressione a última tecla da abreviatura (w).
^n::  ; Hotkey CTRL+N
Run, notepad.exe  ; Abrir o Bloco de Notas quando você pressionar CTRL+N.
return  ; Isto conclui a hotkey. O código que vier abaixo de 'return' não será executado quando você pressionar a hotkey.
^b::  ; Hotkey CTRL+B
Send, {Ctrl down}c{Ctrl up}  ; Copia o texto selecionado. ^c também poderia ser usado, mas aquele método é mais seguro.
SendInput, [b]{Ctrl down}v{Ctrl up}[/b] ; Envolve o texto selecionado em tags de BBCode para torná-lo negrito em um fórum.
return  ; Isto conclui a hotkey. O código que vier abaixo de 'return' não será executado quando você pressionar a hotkey.

3 - Enviando pressionamentos de teclas

Então você decidiu que você quer enviar (digitar) teclas em um programa. Podemos fazer isso. Use o comando Send. Este comando literalmente envia o pressionamento de teclas, para simular a digitação ou o simples pressionamento de quaisquer teclas do teclado.

Mas antes de começar, temos que falar de alguns problemas por que as pessoas costumam passar.

Da mesma forma que hotkeys, o comando Send também tem teclas especiais. Muitas e muitas delas. Eis os quatro símbolos mais comuns:

Símbolo Descrição
! Envia Alt. Por exemplo, Send, Isto é texto!a enviaria as letras (teclas) “Isto é texto” e depois pressionaria Alt+A. Observação: !A produz um efeito diferente de !a em alguns programas. Isso é porque !A faz pressionar Alt+Shift+A e !a faz pressionar Alt+A. Se estiver em dúvida, use letra minúscula.
+ Envia Shift. Por exemplo, Send, +abC envia o texto “AbC”, e Send, !+a pressiona Alt+Shift+A.
^ Envia Ctrl. Por exemplo, Send, ^!a faz pressionar Ctrl+Alt+A, enquanto Send, ^{Home} faz pressionar Ctrl+Home. Observação: ^A produz um efeito diferente de ^a em alguns programas Isso é porque ^A pressiona Ctrl+Shift+A enquanto ^a pressiona Ctrl+A. Se estiver em dúvida, use letra minúscula.
# Envia Win (a tecla do logo do Windows), portanto Send #e faz segurar a tecla Win e então pressionar E.

A tabela gigante na página sobre Send mostra basicamente todas as teclas especiais nativas do AHK. Por exemplo: {Enter} e {Space}.

Cuidado: a tabela mencionada acima não se aplica às hotkeys. Significa que você não envolve Ctrl ou Enter (ou qualquer outra tecla) dentro de {chaves} ao criar uma hotkey.

Um exemplo mostrando o que não deve ser feito com uma hotkey:

; Ao criar uma hotkey...
; ERRADO
{LCtrl}::
Send, AutoHotkey
return

; CERTO
LCtrl::
Send, AutoHotkey
return

Um problema comum que muita gente tem é achar que as chaves são inseridas na documentação só diversão. Mas elas são necessárias. É assim que o AHK sabe que {!} significa “ponto de exclamação” e não “pressione Alt”. Então por favor lembre-se de conferir a tabela na página do comando Send e certifique-se que você inseriu as chaves nos lugares certos. Por exemplo:

Send, Este texto foi digitado{!} ; Notou o ! entre as chaves? É porque, se não houvesse chaves, AHK apertaria a tecla ALT em vez de enviar o ponto de exclamação.
; Mesmo caso acima, mas com a tecla ENTER. AHK iria digitar "Enter" se
; a palavra não estivesse envolta em chaves.
Send, Acabei de criar novas linhas teclando Enter várias vezes. ; ERRADO
Send, Acabei de criar novas linhas teclando {Enter} várias vezes. ; CERTO

Outro problema comum é que as pessoas pensam que tudo deve ser envolto em chaves com o comando Send. Isso é FALSO. Se não estiver na tabela, então não requer chaves. Você não precisa envolver letras comuns, números e nem mesmo uns símbolos tais como . (ponto final) em chaves. Outra coisa, com o comando Send você pode enviar mais do que uma letra, número ou símbolo ao mesmo tempo. Então não precisa de um bando repetições do comando Send para cada letra. Por exemplo:

Send, {a}       ; ERRADO
Send, {b}       ; ERRADO
Send, {c}       ; ERRADO
Send, {a}{b}{c} ; ERRADO
Send, {abc}     ; ERRADO
Send, abc       ; CERTO

Para segurar ou soltar uma tecla, envolva o nome da tecla em chaves e aí use as palavras UP ou DOWN. Por exemplo:

; É assim que você segura uma tecla e pressiona outra(s)
; Se um método não funciona em seu programa, tente o outro.
Send, ^s                     ; Ambos enviam CTRL+S
Send, {Ctrl down}s{Ctrl up}  ; Ambos enviam CTRL+S
Send, {Ctrl down}c{Ctrl up}
Send, {b down}{b up}
Send, {Tab down}{Tab up}
Send, {Up down}  ; Pressiona e segura a tecla SETA PARA CIMA.
Sleep, 1000      ; Segura a tecla por um segundo (1000 milissegundos).
Send, {Up up}    ; Solta a tecla SETA PARA CIMA.

Agora você deve estar se perguntando: “Como eu faço meu comando Send, que ficou bem longo, mais legível?”. Fácil. Use o que chamamos de continuação de seção. Apenas insira um “abre-parênteses” numa nova linha, depois insira seu código e finalmente feche o parêntese em uma linha só dele. Para mais informações, leia sobre Continuações de Seção.

Send,
(
Linha 1
Linha 2
Maçãs são frutas.
)

Observação: há diferentes formas do comando Send. Cada uma delas tem suas características especiais. Se uma das formas do comando Send não funcionar para suas necessidades, tente outro tipo de Send. Simplesmente substitua o comando de nome “Send” por outro dentre os seguintes: SendRaw, SendInput, SendPlay, SendEvent. Para mais informações sobre o que cada um faz, leia isto.

a. Jogos

Isto é importante: vários jogos, especialmente os mais modernos, têm sistemas de prevenção de cheats. São soluções como o GameGuard, Hackshield, PunkBuster e diversos outros. Contornar essas proteções violando os termos de uso do jogo podem fazer que você seja banido; além disso, são sistemas de proteção complexos.

Se um jogo tem um sistema de prevenção de cheats e suas hotkeys, hotstrings e comandos Send não funcionam, você está sem sorte. No entanto, há métodos que podem aumentar as chances de funcionar em alguns jogos, mas não há nenhum botão mágico do tipo “funcione no meu jogo agora!!!” Então tente TODOS os métodos a seguir antes de desistir.

Há também alguns problemas conhecidos com o DirectX. Se você estiver tendo problemas e sabe que o jogo usa DirectX, tente aquilo que está descrito na página das Perguntas Frequentes. Pode ocorrer outros problemas com o DirectX ao se usar PixelSearch, PixelGetColor ou ImageSearch. As cores podem virar preto (0x000000) independentemente da cor que você estiver tentando obter. Você também deve tentar rodar o jogo em modo de janela (windowed), se possível. Isso resolverá alguns problemas relacionados ao DirectX.

Não existe uma solução única para fazer o AutoHotkey funcionar em todos os programas. Se tudo que você tentar falhar, pode ser que o AutoHotkey não sirva para suas necessidades.

Executando programas e abrindo sites da web

Para abrir um programa como mspaint.exe, calc.exe, script.ahk ou até abrir uma pasta, você pode usar o comando Run. O comando Run pode ser usado também para abrir URLs como https://www.autohotkey.com/ . Se seu computador está configurado para rodar o tipo de programa que você quer rodar, então é bem simples:

; Abre/executa/roda um programa. Note que a maioria dos programas exigirá um caminho completo do arquivo:
Run, %A_ProgramFiles%\Some_Program\Program.exe

; Abrir um site:
Run, https://www.autohotkey.com

Há outras funcionalidades avançadas, como parâmetros da linha de comando e CLSID. Se quiser aprender mais sobre, visite a página do comando Run.

Eis mais algumas amostras:

; vários programas não requerem um caminho completo, como os programas-padrão do Windows:
Run, notepad.exe
Run, mspaint.exe ; Abre o Paint.

; Abrir a pasta "Meus documentos" usando uma variável nativa:
Run, %A_MyDocuments%

; Abrir alguns sites:
Run, https://www.autohotkey.com
Run, https://www.google.com

Para informações mais detalhadas e comandos similares, confira a página do comando Run.

5 - Comandos x Funções()

O AutoHotkey tem dois grandes tipos de expedientes que são usados pelo usuário para criar código: comandos e funções.

Uma lista de todos os comandos e funções nativas pode ser encontrada aqui.

Comandos

Você pode identificar o que é um comando ao olhar para sua sintaxe, ou seja, sua forma, seu visual. Comandos não usam parênteses em volta dos parâmetros como as funções. Então um comando se parecerá com isto:

Comando, Parametro1, Parametro2, Parametro3

Quando usar comandos, você não pode atochar outros comandos na mesma linha do comando anterior (exceção: IfEqual). Você não pode pôr comandos dentro dos parâmetros de outros comandos. Por exemplo:

MsgBox, Hello Run, notepad.exe   ; Errado
MsgBox, Hello, Run, notepad.exe  ; Errado

MsgBox, Hello      ; Certo
Run, notepad.exe

Comandos também se diferenciam das funções na medida em que aqueles usam a “sintaxe legada”. Isso significa que você precisa usar sinais de porcentagem em volta do nome de uma variável, como em %Var%, e que nenhum texto ou números precisa estar entre aspas, como em Isto é um texto. Ademais, nos comandos você não pode fazer operações matemáticas nos parâmetros, ao contrário das funções.

Você pode fazer operações matemáticas se você forçar uma expressão com um único %, mas isto não será coberto aqui.

Funções

Como dito acima, funções são diferentes porque elas usam parênteses. Uma função típica tem a seguinte forma:

Funcao(Parametro1, Parametro2, Parametro3)

Funções têm algumas diferenças principais:

  1. Você pode fazer operações matemáticas nelas:
    SubStr(37 * 12, 1, 2)
    SubStr(A_Hour - 12, 2)
  2. Variáveis não precisam estar envoltas em sinais de porcentagem:
    SubStr(A_Now, 7, 2)
  3. Funções podem ocorrer dentro de outras funções:
    SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
  4. Texto deve ser envolto em aspas:
    SubStr("Estou escrevendo código, maravilha!", 16)

Uma função normalmente retorna um valor de forma diferente da forma que um comando retorna valores. Comandos requerem um parâmetro OutputVar (variável de saída); funções dispensam. O jeito mais comum de atribuir o valor de uma função a uma variável é o seguinte:

MinhaVar := SubStr("Estou escrevendo um script, uau!", 16)

Essa não é a única forma, mas a mais comum. Você está usando MinhaVar para armazenar o valor de retorno da função que está à direita do operador :=. Vide Funções para mais detalhes.

Em resumo:

; Estes são comandos:
MsgBox, Este é um texto.
StringReplace, Output, Input, AutoHotKey, AutoHotkey, All
SendInput, Isto é magnífico{!}{!}{!}

; Estas são funções:
SubStr("Estou escrevendo código, maravilha!", 16)
FileExist(VariavelContendoOCaminho)
Output := SubStr("Estou escrevendo código, maravilha!", 16)

a. Blocos de código

Blocos de código são linhas de código circundadas por pequenas chaves ({ e }). Elas agrupam uma seção do código de forma que o AutoHotkey saberá que se trata de uma única grande família e que precisa ficar junta. Eles são mais usados com funções e instruções de fluxo de controle, como If e Loop. Sem os blocos de código delimitados por chaves, somente a primeira linha do bloco é chamada.

No código a seguir, as duas linhas são executadas somente se MinhaVariavel é igual a 5:

if (MinhaVariavel = 5)
{
    MsgBox, MinhaVariavel é igual a %MinhaVariavel%!!
    ExitApp
}

No código a seguir, a caixa de mensagens só é mostrada se MinhaVariavel é igual a 5. O script vai terminar de qualquer jeito, mesmo se MinhaVariavel não é igual a 5:

if (MinhaVariavel = 5)
    MsgBox, MinhaVariavel é igual a %MinhaVariavel%!!
    ExitApp

Essa forma sem chaves funcionou perfeitamente pois a instrução com if só tinha uma linha de código associada a ela. Já o caso a seguir é exatamente o mesmo do acima, mas eu diminuí o recuo da segunda linha de forma que agora ela está separada da instrução com if:

if (MinhaVariavel = 5)
    MsgBox, MinhaVariavel é igual a %MinhaVariavel%!!
MsgBox, Agora estamos 'fora' da instrução com If. Aqui, nós não precisamos de chaves pois havia somente uma linha sob a instrução.

6 - Variáveis

Variáveis são como pequenas notas escritas em post-its que contêm informações. Elas podem ser usadas para armazenar texto, números, dados vindos de funções e comandos e até mesmo equações matemáticas. Sem elas, a programação e a confecção de scripts seriam muito mais tediosas.

Variáveis podem ser atribuídas (ter dados associados a elas) de alguns jeitos. Vamos cobrir os mais comuns. Por favor preste atenção ao sinal de igualdade =.

Forma “legada” de atribuição de texto
MinhaVar = Texto

Esta é a forma mais simples para uma variável: a atribuição legada. Simplesmente digite seu texto e pronto.

Forma “legada” de atribuição de variáveis
MinhaVar = %MinhaVar2%

O mesmo de antes, mas agora você está atribuindo o valor de uma variável a outra variável.

Forma legada mista
MinhaVar = %MinhaVar2% algum texto %MinhaVar3%

Uma combinação das duas formas legadas anteriores.

Atribuição de texto como expressão
MyVar := "Texto"

Esta é uma atribuição de expressão, devido ao : antes do =. Qualquer texto que vier terá que vir entre aspas.

Atribuição de variável como expressão
MinhaVar := MinhaVar2

No modo de expressão, as variáveis não precisam de sinais de porcentagem.

Atribuição de número como expressão
MinhaVar := 6 + 8 / 3 * 2 - Sqrt(9)

Graças às expressões, você pode fazer operações matemáticas!

Atribuição de expressão mista
MinhaVar := "O valor de 5 + " MinhaVar2 " é: " 5 + MinhaVar2

Uma combinação das três formas de se atribuir variáveis acima.

Sinais de igualdade (=) com um símbolo na frente deles, tais como := += -= .= etc. são chamados de operadores de atribuição e sempre requerem uma expressão.

a. Quando usar o símbolo de porcentagem

Um dos problemas mais comuns com o AutoHotkey envolvendo variáveis é quando usar sinais de porcentagem (%). Este trecho provavelmente vai solucionar algumas confusões.

Quando usar os símbolos de porcentagem:

Quando não usar sinais de porcentagem:

b. Recebendo entrada do usuário

De vez em quando você pode querer que o usuário escolha o valor das coisas. Há vários jeitos de fazer isso, mas o mais simples é por meio do comando InputBox. Aqui está um exemplo simples de como fazer um par de perguntas ao usuário e, em seguida, fazer algo com o dado inserido:

InputBox, OutputVar, Pergunta 1, Qual é seu primeiro nome?
if (OutputVar = "Leo")
    MsgBox, Esse é um nome maravilhoso`, %OutputVar%.

InputBox, OutputVar2, Pergunta 2, você gosta do AutoHotkey?
if (OutputVar2 = "sim")
    MsgBox, Obrigado por responder %OutputVar2%`, %OutputVar%! Nós nos tornaremos grandes amigos.
else
    MsgBox, %OutputVar%`, isso me deixa triste.

c. Outros exemplos?

MsgBox, 4,, Gostaria de continuar?
IfMsgBox, No
    return  ; Se não, impeça o código de seguir adiante.
MsgBox, Você pressionou SIM.  ; Do contrário, o usuário escolheu sim.
; Alguns exemplos mostrando quando usar "%" e quando não:
Var = Texto  ; Atribuir um pedaço de texto a uma variável (forma legada).
Numero := 6  ; Atribuir um número a uma variável (expressão).
Var2 = %Var%  ; Atribuir o valor de uma variável a outra variável (forma legada).
Var3 := Var  ; Atribuir o valor de uma variável a outra variável (expressão).
Var4 .= Var  ; Acrescentar a variável ao final de outra (expressão).
Var5 += Numero  ; Somar o valor de uma variável ao de outra (expressão).
Var5 -= Numero  ; Subtrair o valor de uma variável do de outra (expressão).
Var6 := SubStr(Var, 2, 2)  ; Variável dentro de uma função. Isto é sempre uma expressão.
Var7 = %Var% Texto  ; Atribuir o valor de uma variável a outra com um texto extra (forma legada).
Var8 := Var " Text"  ; Atribuir o valor de uma variável a outra com um texto extra (expressão).
MsgBox, %Var%  ; Variável dentro de um comando. 
StringSplit, Var, Var, x  ; Variável dentro de um comando que usa InputVar e OutputVar (variável de entrada e variável de saída).
if (Numero = 6)  ; Toda vez que uma instrução com If contiver parênteses, ela será uma expressão. Então nada de sinais de porcentagem.
if (Var != Numero)  ; Toda vez que uma instrução com If contiver parênteses, ela será uma expressão. Então nada de sinais de porcentagem.
if Numero = 6  ; Sem os parênteses, o If fica na forma legada. Contudo, somente as variáveis no 'lado direito' precisam de sinais de porcentagem. 
if Var1 < %Var2%  ; Sem os parênteses, o If fica na forma legada. Contudo, somente as variáveis no 'lado direito' precisam de sinais de porcentagem.

7 - Objetos

Objetos são uma forma de organizar seus dados para um uso mais eficiente. Algumas vezes os objetos são referidos como vetores, mas é importante notar que vetores são só objetos. Nós chamamos diferentes coisas de objetos dependendo de para que estamos usando-os, mas todos os objetos são a mesma coisa.

Um objeto é basicamente uma coleção de variáveis. Os nomes das variáveis são chamados “Chaves” (Keys), e o conteúdo das variáveis, “Valores” (values).

Quando você ouvir alguém chamar um objeto de vetor ou de vetor indexado, isso geralmente significa que todas as chaves são uma sequência de números começando em 1. Quando você ouvir alguém chamar um objeto de vetor associativo, significa que as chaves são ou strings (texto) ou números não sequenciais. E outras vezes são um misto de ambos, e números em sequência também!

Não há restrições quanto a o que uma chave ou valor podem ser, e eles podem inclusive ser outros vetores! Quando os valores são vetores também, isso é chamado de vetor aninhado, que serão explicados mais tarde.

Há várias razões para você querer usar um objeto para algo. Alguns exemplos:

a. Criando objetos

Há alguns jeitos de se criar um objeto, e os mais comuns são os listados abaixo:

Sintaxe de colchetes
MeuObjeto := ["um", "dois", "três", 17]

Isso o iniciará naquilo que se chama “vetor indexado”. Um vetor indexado é um objeto representando uma lista de itens numerados de 1 em diante. No exemplo posto, o valor “um” é armazenado na chave 1 do objeto (também conhecido como índice 1), e o valor 17 é armazenado na chave 4 do objeto (ou índice 4).

Sintaxe de chaves
Banana := {"Cor": "Amarelo", "Gosto": "Delicioso", "Preco": 3}

A forma acima permite que você defina um “vetor associativo”. Um vetor associativo é uma coleção de dados na qual cada item tem um nome. No exemplo acima, o valor "Amarelo" é armazenado na chave "Cor" do objeto. Além disso, o valor 3 é armazenado na chave "Preco" do objeto.

Função vetorial
MeuObjeto := Array("um", "dois", "tres", 17)

A forma acima é equivalente à sintaxe com colchetes, mas envolta em uma função.

Função-objeto
Banana := Object("Cor", "Amarelo", "Gosto", "Delicioso", "Preco", 3)

A forma acima é equivalente à sintaxe com chaves, mas envolta em uma função.

É importante lembrar que cada uma das definições acima cria a mesma coisa — objetos — apenas com diferentes chaves.

b. Usando objetos

Há várias formas de se usar objetos, inclusive obter valores armazenados, definir valores, adicionar mais valores e mais.

Para definir valores:

Notação de colchetes
Banana["Em conserva"] := True ; Esta banana ficou imersa em vinagre. Argh.

Definir valores em um objeto é tão simples quanto definir o valor de uma variável. Tudo o que você deve fazer é inserir seu código com notação de colchetes no lado esquerdo do operador de definição da expressão :=.

Notação de ponto
Banana.Consistência := "Molenga"

O mesmo do exemplo anterior, mas com a notação de ponto.

Para obter (ou recuperar) valores:

Notação de colchetes
Valor := Banana["Cor"]

Esta notação permite que você use uma expressão como a chave para obter um valor de seu objeto. Neste caso, eu usei a expressão simples "Cor", a qual é, como você esperava, a chave Cor. Disso você obterá uma caixa de mensagem com a palavra “Amarelo”, porque é esse o valor que armazenamos na chave Cor na seção anterior.

Notação de ponto
Valor := Banana.Cor

Esta notação permite somente que você use strings literais para as chaves. Você não pode usar variáveis em suas chaves com a notação de ponto.

Para adicionar novas chaves e valores:

Notação de colchetes
MeuObjeto["NovaChave"] := 3.1415

Para diretamente adicionar uma chave e um valor, basta definir uma chave que não existe ainda.

Notação de ponto
MeuObjeto.NovaChave := "Brilhante"

O mesmo do exemplo anterior, mas com a notação de ponto.

Método InsertAt
MeuObjeto.InsertAt(Indice, Valor1, Valor2, Valor3...)

Indice é qualquer chave cujo tipo de dados é um inteiro. Isso vai “empurrar para frente” TODAS as chaves inteiras, adicionando a cada uma delas o número de valores que foram inseridos, mesmo se houver lacunas (por exemplo, somente as chaves 1 a 100 existem e você insere um valor na chave de índice 50, o que elevará o número 100 para 101).

Método “Push”
MeuObjeto.Push(Valor1, Valor2, Valor3...)

Este método acrescenta os valores ao final do vetor MeuObjeto. Em outras palavras, ele insere os valores na maior chave inteira mais um.

Para remover chaves e valores:

Método da substituição por “em branco”
Banana.Consistência := ""

O jeito mais simples de remover um valor é simplesmente substitui-lo por “nada”. Você pode fazer isso mudando o valor para "", o que também é conhecido como string vazia. Isso não remove a chave, mas fará o valor se parecer idêntico a um valor que ainda não foi definido. É possível saber que a chave ainda existe usando o método HasKey, e ainda assim ela será contada num Loop com For.

Método da deleção
ValorDeletado := MeuObjeto.Delete(QualquerChave)

Este método e o próximo abaixo removem a chave e o valor. O valor anterior de MeuObjeto[QualquerChave] será armazenado em ValorDeletado.

NumeroDeChavesDeletadas := MeuObjeto.Delete(PrimeiraChave, UltimaChave)

Permite que você remova um intervalo de chaves que sejam strings ou números/inteiros entre PrimeiraChave e UltimaChave. O valor que o método dará será o número de chaves que foram removidas, o que é útil se você tem uma lacuna entre suas chaves (por exemplo, você especificou as chaves 1 a 4, mas a chave número 2 não existe, isso definirá NumeroDeChavesDeletadas para 3 já que somente três chaves estavam lá para ser removidas.

Método Pop
MeuObjeto.Pop()

Este remove a maior chave inteira e retorna seu valor. Não há chaves maiores que ela para serem afetadas.

Método RemoveAt
ValorRemovido := MeuObjeto.RemoveAt(Indice)
NumeroDeChavesRemovidas := MeuObjeto.RemoveAt(Indice, Comprimento)

Esse método remove todas as chaves do intervalo Indice até Indice - Comprimento - 1 (inclusive). Se Comprimento é omitido, ele assume o valor padrão 1. Depois de remover as chaves, ele tomará todas as chaves maiores remanescentes e as moverá para baixo para preencher a lacuna, de forma que, se havia um valor em Indice + Comprimento, ele ficará agora em Indice. Isso é similar ao funcionamento do método InsertAt com múltiplos valores especificados.

8 - Outras utilidades

Chegamos ao fim de nossa jornada, meu amigo. Espero que você tenha aprendido algo. Mas antes de irmos embora, aqui estão mais algumas coisinhas que eu acho que você deveria saber. Aproveite!

a. Os misteriosos colchetes

Ao longo desta documentação, você verá estes dois símbolos ([ e ]) em volta do código no espaço amarelo da sintaxe no topo da maioria das páginas. Tudo o que estiver dentro desses colchetes é OPCIONAL. O que significa que as coisas dentro dos colchetes podem ser omitidas se você não precisar delas. Quando estiver escrevendo seu código, é muito importante que você NÃO insira os colchetes nele!

Na página do comando ControlGetText você verá isto:

ControlGetText, VarDeSaida , Control, TituloJanela, TextoJanela, TituloExcluido, TextoExcluido

Então você pode simplesmente fazer isso se você quiser:

ControlGetText, VarDeSaida

Ou adicionar mais alguns detalhes:

ControlGetText, VarDeSaida, Controle, TituloJanela

E se você só quiser usar TituloExcluido mas não preencher o espaço dedicado aos parâmetros TextoJanela ou TituloJanela? Simples!

ControlGetText, VarDeSaida, Controle,,, TituloExcluido

Por favor note que você não pode IGNORAR os parâmetros, mas você pode deixá-los em branco. Se você ignorasse TituloJanela, TextoJaneta, então ficaria assim e daria problemas:

ControlGetText, VarDeSaida, Controle, TituloExcluido

b. Determinando a versão de seu AHK

Execute este código para ver a versão de seu AutoHotkey:

MsgBox, %A_AhkVersion%

Ou procure pelo arquivo “AutoHotkey Help File” ou “AutoHotkey.chm” no menu iniciar ou no diretório de instalação do programa.

c. Tentativa e erro

Tentativa e erro é uma maneira muito comum e eficaz de aprender. Em vez de pedir ajuda para cada pequena coisa, às vezes gastar um tempo sozinho (pode chegar a horas ou dias) e tentar fazer algo funcionar vai ajudá-lo a aprender mais rápido.

Se você tentar algo e obtiver um erro, estude esse erro. Daí tente arrumar seu código. Então tente executá-lo de novo. Se você ainda estiver se deparando com o erro, modifique seu código um pouco mais. Continue tentando e falhando até que seu código não falhe mais. Você vai aprender um bocado desse jeito lendo a documentação, lendo os erros e descobrindo o que funciona e o que não. Tente, falhe, tente, falhe, tente, tente, falhe, falhe, consiga!

Foi assim que muitos “prós” aprenderam. Mas não se acanhe em pedir ajuda, nós não mordemos (forte). Aprender leva tempo, os “prós” que você encontrar não dominaram a parada em apenas algumas horas ou dias.

“Se de começo você não conseguir, tente, tente, tente novamente.” — William E. Hickson.

d. Indentação

Esse negócio de indentação é muito importante! Seu código irá executar perfeitamente sem ela, mas será uma grande dor de cabeça para você e outros para lerem seu código. Pequenos códigos (25 linhas ou menos) serão provavelmente fáceis de se ler sem indentação, mas daqui a pouco vai ficar desleixado. É melhor que você aprenda a indentar o quanto antes. Não existe estilo estabelecido para indentar, mas é melhor deixar tudo coerente.

O que é indentação?”, você pergunta. É simplesmente a prática de inserir espaços para dividir seu código de forma que você saiba o que pertence a quê. As pessoas normalmente usam 3 ou 4 espaços ou 1 tab por “nível”.

Não indentado:

if (carro = "velho")
{
MsgBox, O carro está bem velho.
if (pneu = "murcho")
{
MsgBox, Este carro não está seguro para dirigir.
return
}
else
{
MsgBox, Tome cuidado! Este carro estará perigoso de dirigir.
}
}
else
{
MsgBox, Meu`, que possante brilhoso é esse seu novo carro.
}

Indentado:

if (carro = "velho")
{
    MsgBox, O carro está bem velho.
    if (pneu = "murcho")
    {
        MsgBox, Este carro não está seguro para dirigir.
        return
    }
    else
    {
        MsgBox, Tome cuidado! Este carro estará perigoso de dirigir.
    }
}
else
{
    MsgBox, Meu`, que possante brilhoso é esse seu novo carro.
}

Veja o artigo Indentation Style na Wikipédia em inglês para ver vários estilos e exemplos. Escolha aquele estilo que você gostou ou aprenda a indentar daquele jeito que você acha que é mais fácil de ler.

e. Pedindo ajuda

Antes de perguntar, tente pesquisar um pouco por conta própria ou tente escrever o código você mesmo. Se isso não gerar os resultados que lhe satisfaçam, continue lendo.

Se você não obtiver uma resposta logo, espere pelo menos um dia (24 horas) antes de pedir mais ajuda. Amamos ajudar, mas também fazemos isto de graça (igual a esta tradução!) em nosso tempo livre. Podemos estar com a família, no trabalho, jogando, dormindo, ou simplesmente muito ocupados no momento.

E, enquanto você espera pela ajuda, você pode ir tentando e aprendendo sozinho. É uma sensação ótima conseguir fazer algo sem ajuda.

f. Outros links

Perguntas Frequentes (FAQ)