# Tutorial para Iniciantes do AutoHotkey escrito por tidbit

## Tabela de Conteúdos

1. Os Básicos
   1. Baixando e Instalando o AutoHotkey
   2. Como criar um script
   3. Você não pode misturar comandos
   4. Como encontrar o arquivo de ajuda no seu computador
2. Hotkeys & Hotstrings
   1. Teclas e seus símbolos misteriosos
   2. Hotkeys/Hotstrings de janela específica
   3. Várias hotkeys/hotstrings por arquivo
   4. Exemplos
3. Enviando teclas
   1. Jogos
4. Executando Programas & Websites
5. Comandos vs. Funções()
   1. Blocos de código
6. Variáveis
   1. Quando usar porcentagem
   2. Obtendo entrada do usuário
   3. Outros Exemplos?
7. Objetos
   1. Criando Objetos
   2. Usando Objetos
8. Outras Dicas Úteis
   1. As misteriosas chaves
   2. Encontrando a versão do AutoHotkey
   3. Tentativa e Erro
   4. Indentação
   5. Procurando Ajuda
   6. Outros Links

## 1 - Os Básicos

Antes de começarmos nossa jornada, deixe-me aconselhá-lo. Através deste tutorial você verá muitos textos e códigos. Para aprimorar o poder de aprendizado, é aconselhável que você leia o texto e tente o código. Então, estude o código. Você pode copiar e colar a maioria dos exemplos mostrados nessa página. Se você ficar confuso, tente ler a seção novamente.

### a. Baixando e Instalando o AutoHotkey

Desde que você esteja vendo essa documentação localmente, você provavelmente já tem o AutoHotkey instalado e pode pular para a seção b.

Antes de aprender a usar o AutoHotkey (AHK), você precisará baixá-lo. Após fazer o download, você pode precisar instalar ele. Mas isso depende da versão que você quer. Para esse guia usaremos o instalador, visto que é a maneira mais fácil.

#### Instruções em texto:

1. Vá para a página inicial 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, será solicitado que você escolha entre UNICODE ou ANSI. Em poucas palavras, você provavelmente irá querer escolher UNICODE, tendo em vista que ele possui suporte para letras e números (caracteres) não-ingleses. Prossiga até você ver um botão de instalação.
4. Uma vez concluído, está pronto! Continue para a seção b.

Para um vídeo instrutivo, assista Install and Hello World no YouTube.

### b. Como criar um script

Agora que você possui o AutoHotkey instalado, você provavelmente deve querer fazer alguma coisa. O AutoHotkey não é mágico, queríamos que fosse, mas não é. Então precisamos dizer para ele o que fazer. Esse processo é chamado de "Scripting"

#### Instruções em texto:

1. Clique com o botão direito na sua área de trabalho.
2. Encontre "New" no menu.
3. Clique em "AutoHotkey Script" dentro do menu "New".
4. Dê um nome para o novo s cript.. Ele deve terminar com uma extensão .ahk. Por exemplo: MyScript.ahk
5. Encontre o arquivo mais recentemente criado na sua área de trabalho e clique com o botão direito sobre ele.
6. Clique em "Edit Script".
7. Uma janela deve ter sido aberta, provavelmente o Bloco de Notas. Se isso aconteceu, SUCESSO!

   Agora que você tem um script criado, precisamos adicionar alguma coisa dentro do arquivo. Para uma lista de todos os comandos e variáveis embutidas, veja a seção 5.

   Aqui está um script bem simples contendo uma hotkey que digita texto usando o comando Send quando a hotkey é pressionada:

       ^j::
       Send, Meu Primeiro Script
       return

   Nós iremos nos aprofundar mais posteriormente. Até que isso ocorra, aqui está uma explicação do código acima:

   - A primeira linha: `^j::` é a hotkey. `^` significa`Ctrl`, `j` é a letra `J`. Tudo ao lado esquerdo de `::` são as teclas que você precisa pressionar.
   - A segunda linha: `Send, Meu Primeiro Script` é como você send (envia) teclas diretamente. `Send` é o comando, tudo depois da vírgula (,) será digitado.
   - A terceira linha: `return`. Isso se tornará seu melhor amigo. Ele literalmente impede que o código prossiga adiante, para as linhas abaixo. Isso evita muitos problemas quando você começa a ter muitas coisas em seus scripts.
8. Salve o arquivo.
9. Clique duas vezes sobre o ícone/arquivo na área de trabalho para executá-lo. Abra o Bloco de Notas (ou qualquer lugar onde você possa digitar) e pressione `Ctrl` e `J`.
10. Uhul!!! Seu primeiro script está concluído. Vá pegar alguns petiscos como recompensa então retorne para ler o restante deste tutorial.

Para um vídeo instrutivo, assista Install and Hello World no YouTube.

### c. Você não pode misturar comandos

Quando estiver fazendo seu código, talvez você sinta a necessidade de colocar vários comando na mesma linha ou um dentro do outro, mas não faça isso. Na seção 5 falaremos sobre o porque disso não funcionar como você espera e o que pode ser feito para contornar.

### d. Como encontrar o arquivo de ajuda no seu computador

Há várias formas de fazer isso, assumirei que você o possui instalado na localização padrão:

Método 1:

1. Encontre o Menu Iniciar ou a Orb de Início na sua tela (normalmente posicionado no canto inferior esquerdo).
2. Clique em Programas ou Todos os Programas.
3. Encontre AutoHotkey na lista.
4. Então você deve ver AutoHotkey Help File. Clique.
5. Feito!

Método 2:

1. Vá para sua área de trabalho.
2. Encontre Meu Computador ou Computador. Abra.
3. Vá para seu disco rígido que contenha o AutoHotkey. Provavelmente o disco C:\.
4. Procure dentro de todas as pastas Arquivos de Programas por AutoHotkey.
5. Procure por AutoHotkey.chm ou um arquivo chamado AutoHotkey e que possua uma interrogação amarela nele.
6. Feito!

## 2 - Hotkeys & Hotstrings

O que é uma hotkey? Uma hotkey é uma tecla que é quente para o toque. ¹ ... Brincadeira. Ela é uma tecla ou combinação de teclas que a pessoa pressiona no teclado para acionar algumas ações. Por exemplo:

    ^j::
    Send, Meu Primeiro Script
    return

O que é uma hotstring? Hotstrings são usadas principalmente para expandir abreviações assim que você as digita (auto-substituição), elas também podem ser usadas para iniciar qualquer ação script. Por exemplo:

    ::lab::Libertem as baleias

A diferença entre os dois exemplos é que a hotkey será acionada quando você pressionar `Ctrl`+`J` enquanto que a hotstring converterá seu "lab" em "Liberte as baleias".

"Bem, então como uma pessoa como eu cria uma hotkey?". Boa pergunta. Uma hotkey é criada usando um único par de dois-pontos. A tecla ou combinação de teclas precisa ir do lado esquerdo de `::`, e o conteúdo precisa ir abaixo, seguido por um `return`.

OBS: Há exceções, mas elas costumam causar confusão na maior parte do tempo. Por causa disso elas não serão abordadas no tutorial, pelo menos não agora.

    Esc::
    MsgBox, Escape!!!!
    return

Uma hotstring possui um par de dois-pontos em cada lado do texto que você quer que acione a substituição de texto, enquanto que o texto subistituto fica do lado direito do segundo par de dois-pontos.

Hotstrings, como mencionado acima, também podem iniciar ações script. É mais correto dizer que elas "fazem quase tudo". O mesmo vale para as hotkeys.

    ::btw::
    MsgBox, Você digitou btw.
    return

Uma ótima coisa a se saber é que você pode ter muitas linhas de código para cada hotkey, hotstring, label e muitas outras coisas que nem sequer falamos ainda.

    ^j::
    MsgBox, Wow!
    MsgBox, Existem
    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. Teclas e seus símbolos misteriosos

Talvez você esteja se perguntando "Como eu saberia que ^ significa `Ctrl`?!". Bem, boa pergunta. Para ajudar você a aprender o que ^ e outros símbolos significam, dê uma olhada nessa tabela:

Símbolo | Descrição
--- | ---
# | `Win` (Tecla do logotipo do Windows).
! | `Alt`
^ | `Control`
+ | `Shift`
& | Um "comercial" pode ser usado entre duas teclas ou botões de mouse quaisquer para combiná-los em uma hotkey customizada.

(Para a lista completa de simbolos, veja a página Hotkey)

Além disso, para uma lista com todos os nomes de hotkeys que podem ser usadas do lado esquerdo do par de dois-pontos, veja Lista de teclas, botões do mouse e controles de joystick.

Você pode definir uma combinação customizada de duas (e apenas duas) teclas (exceto botões de joystick) usando `&` entre elas. No exemplo abaixo, você seguraria a tecla Numpad0 e então pressionaria Numpad1 ou Numpad2 para acionar uma das hotkeys:

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

    Numpad0 & Numpad2::
    Run, notepad.exe
    return

Agora você deve estar se perguntando se hotstrings posuem algum modificador tão legal quanto as hotkeys. Sim, elas tem! Os modificadores de hotstrings ficam entre o primeiro par de dois-pontos Por exemplo:

    :*:lab::Libertem as baleias

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

### b. Hotkeys/Hotstrings de janela específica

Às vezes, você pode querer que uma hotkey ou hotstring funcione apenas (ou seja desativada) em uma certa janela. Para fazer isso, você precisa usar um desses lindos comandos com uma # na frente deles:

    #IfWinActive
    #IfWinExist

Esses comandos especiais (tecnicamente chamados de "diretivas") criam hotkeys e hotstrings contexto-sensitivas. Simplesmente especifique um título de uma janela. Em alguns casos você pode querer especificar critérios como HWND, grupo ou classe. Esses são um pouco mais avançados e serão abordados mais aprofundadamente aqui: O Parâmetro WinTitle & a Última Janela Encontrada.

    #IfWinActive Sem título - Bloco de notas
    #Space::
    MsgBox, Você pressionou WIN+SPACE no Bloco de Notas.
    return

Para desabilitar a contexto-sensibilidade para hotkeys ou hotstrings subsequentes, especifique qualquer diretiva #IfWin mas deixe todos os 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 no Bloco de Notas.
    return

    ; Qualquer janela que não for Sem título - Bloco de notas
    #IfWinActive
    !q::
    MsgBox, Você pressionou ALT+Q em uma janela qualquer.
    return

Quando a diretiva #IfWin nunca é utilizada em um script, todas as hotkeys e hotstrings são habilitadas para todas as janelas.

As diretivas #IfWin são posicionais, isto é, elas afetam todas as hotkeys e hotstrings fisicamente abaixo delas no script. Elas também são mutualmente exclusiva, o que significa que apenas a mais recente estará em efeito.

    ; Bloco de Notas
    #IfWinActive ahk_class Notepad
    #Space::
    MsgBox, Você pressionou WIN+SPACE no Bloco de Notas.
    return
    ::msg::Você digitou msg no Bloco de Notas
    ; Microsoft Paint
    #IfWinActive Sem título - Paint
    #Space::
    MsgBox, Você pressionou WIN+SPACE no Microsoft Paint!
    return
    ::msg::Você digitou msg no Microsoft Paint!

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

### c. Várias hotkeys/hotstrings por arquivo

Isso, por algum motivo, confunde a mente das pessoas. Devido isso, serei bem claro: O AutoHotkey possui a capacidade de ter quantas hotkeys e hotstrings você quiser em um arquivo. Seja 1 ou 3253 (até mais do que isso).

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

    ^p::
    Run, notepad.exe
    return

    ~j::
    Send, ack
    return

    :*:acheiv::achiev
    ::achievment::achievement
    ::acquaintence::acquaintance
    :*:adquir::acquir
    ::aquisition::acquisition
    :*:agravat::aggravat
    :*:allign::align
    ::ameria::America

O código acima é perfeitamente aceitável.. Várias hotkeys, várias hotstrings. Tudo em um grande e alegre script.

### d. Exemplos

    ::pfn::por falar nisso  ; Substitui "pfn" por "por falar nisso" assim que você pressiona um caractere de encerramento padrão.

    :*:btw::by the way  ; Replaces "btw" with "by the way" without needing an ending character.

    ^n::  ; CTRL+N hotkey
    Run, notepad.exe  ; Executa o Bloco de Notas quando você pressiona CTRL+N.
    return  ; Isso encerra a hotkey. O código abaixo disso não será acionado.

    ^b::  ; CTRL+B hotkey
    Send, {Ctrl down}c{Ctrl up}  ; Copia o texto selecionado. ^c também poderia ser usado, mas esse método é mais seguro.
    SendInput, [b]{Ctrl down}v{Ctrl up}[/b] ; Envolve o texto selecionado em tags de BBCode para fazê-lo ficar em negrito em um fórum.
    return  ; Isso encerra a hotkey. O código abaixo desse ponto não será acionado.

## 3 - Enviando Teclas

Suponhamos que você decidiu que quer enviar (digitar) teclas em um programa. Podemos fazer isso. Use o comando Send. Esse comando literalmente envia teclas diretamente, para simular a digitação ou o pressionamento de teclas.

Mas antes de falarmos sobre essas coisas, devemos falar sobre alguns problemas comuns que as pessoas enfrentam.

Assim como as hotkeys, o comando Send possui teclas especiais também. Muitas e muitas delas. Aqui há os quatro símbolos mais comuns:

Símbolo | Descrição
--- | ---
! | Envia a tecla `Alt`. Por exemplo, `Send, Esse texto!a` enviaria as teclas "Esse texto" e então pressionaria `Alt`+`A`. OBS: `!A` produz um efeito diferente de `!a` em alguns programas. Isso ocorre porque `!A` pressiona `Alt`+`Shift`+`A` e `!a` pressiona `Alt`+`A`. Se ficar na dúvida, use a letra minúscula.
+ | Envia a tecla `Shift`. Por exemplo, `Send, +abC` enviaria o texto "AbC", e `Send, !+a` pressionaria `Alt`+`Shift`+`A`.
^ | Envia a tecla `Control` (`Ctrl`). Por exemplo, `Send, ^!a` pressionaria `Ctrl`+`Alt`+`A`, e `Send, ^{Home}` enviaria `Ctrl`+`Home`. OBS: `^A` produz um efeito diferente de `^a` em alguns programas. Isso ocorre porque `^A` pressiona `Ctrl`+`Shift`+`A` e `^a` pressiona`Ctrl`+`A`. Se ficar na dúvida, use a letra minúscula.
# | Envia a tecla `Win` (a tecla que possui o logotipo do Windows) e portanto `Send #e` seguraria a tecla `Win` e pressionaria a letra "e".

A gigantesca tabela na página Send mostra melhor cada tecla especial embutida no AHK. Por exemplo: `{Enter}` e `{Space}`.

Atenção: Essa tabelanão se aplica à hotkeys. Isso significa que você não deve envolver `Ctrl` ou `Enter` (ou qualquer outra tecla) dentro de chaves quando estiver fazendo uma hotkey.

Aqui está um exemplo do que não deve ser feito para uma hotkey:

    ; Quando estiver fazendo uma hotkey, isso está...
    ; INCORRETO
    {LCtrl}::
    Send, AutoHotkey
    return

    ; CORRETO
    LCtrl::
    Send, AutoHotkey
    return

Um problema comum que muitas pessoas têm é assumir que as chaves são colocadas nas páginas da documentação apenas por diversão. Mas na verdade elas são necessárias. É através delas que o AHK sabe que `{!}` significa "ponto de exclamação" e não "pressione a tecla `Alt`". Então lembre-se de conferir a tabela na página Send e certificar-se que você está colocando suas chaves nos lugares certos. Por exemplo:

    Send, Esse texto foi digitado{!} ; Percebe o ! entre as chaves? Isso ocorre porque se ele não estivesse o AHK pressionaria a tecla ALT.

    ; O mesmo que acima, mas com a tecla ENTER. O AHK digitaria "Enter" se
    ; ele não estivesse envolvido em chaves.
    Send, Várias linhas foram enviadas. ; INCORRETO
    Send, Várias{Enter}linhas{Enter}foram enviadas. ; CORRETO

Outro problema comum é que as pessoas pensam que tudo precisa ser envolvido em chaves com o comando Send. Isso está ERRADO. Se não estiver na tabela, não há necessidade de usar chaves. Você não precisa envolver letras comuns, números ou até mesmo outros símbolos como `.` (ponto final) em chaves. Além disso, com os comandos Send você é capaz de enviar mais do que uma letra, número ou símbolo por vez. Não há necessidade de um monte de comandos Send com uma letra cada. Por exemplo:

    Send, {a}       ; INCORRETO
    Send, {b}       ; INCORRETO
    Send, {c}       ; INCORRETO
    Send, {a}{b}{c} ; INCORRETO
    Send, {abc}     ; INCORRETO
    Send, abc       ; CORRETO

Para segurar ou soltar uma tecla, envolva o nome da tecla em chaves e então use a palavra UP ou DOWN. Por exemplo:

    ; É assim que você mantém pressionada uma tecla e pressiona outra tecla (ou teclas).
    ; Se um método não funcionar em seu programa, tente outro.
    Send, ^s                     ; Qualquer um desses envia CTRL+S
    Send, {Ctrl down}s{Ctrl up}  ; Qualquer um desses envia CTRL+S
    Send, {Ctrl down}c{Ctrl up}
    Send, {b down}{b up}
    Send, {Tab down}{Tab up}
    Send, {Up down}  ; Mantém pressionada a tecla "seta para cima".
    Sleep, 1000      ; Mantém ela pressionada por um segundo.
    Send, {Up up}    ; Solta a tecla "seta para cima".

Se agora você está se perguntando "Como eu faço meus comandos Send extensamente longos legíveis?". Fácil. Use o que é conhecido como continuação de seção. Simplesmente especifique uma abertura de parênteses em uma nova linha, então o seu conteúdo e por fim um parêntese de fechamento em sua própria linha. Para mais informações, leia sobre Continuações de Seções.

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

OBS: Há várias formas diferentes do comando Send. Cada uma tem suas próprias funções especiais. Se uma forma do comando Send não funcionar para sua necessidade, tente outro tipo. Simplesmente substitua o nome do comando "Send" por um dos seguintes: SendRaw, SendInput, SendPlay, SendEvent. Para mais informações sobre o que cada um deles faz, leia isso.

### a. Jogos

Isso é importante: Muitos jogos, especialmente os mais modernos, possuem softwares de prevenção contra trapaças. Coisas como GameGuard, Hackshield, PunkBuster e vários outros. Burlar esses sistemas não é apenas só uma violação das políticas desses jogos e pode fazer você ser banido, como também é algo complexo de se fazer.

Se um jogo possuir um sistema de prevenção contra trapaças e suas hotkeys, hotstrings e comandos Send não funcionam, você está sem sorte. No entanto, há métodos que podem aumentar a chance de funcionamneto em alguns jogos, mas não é algo com um botão mágico "faça isso funcionar no meu jogo agora!". Então tente TODOS esses antes de desistir.

Também existem problemas conhecidos com o DirectX Se você estiver tendo problemas e você sabe que o jogo usa DirectX, tente fazer o que foi descrito na página FAQ. Muitos problemas de DirectX podem ocorrer quando se está utilizando PixelSearch, PixelGetColor ou ImageSearch. As cores podem se tornar a cor preta (0x000000) não importando qual cor você tente obter. Você também deve tentar executar o jogo no modo janela, se possível. Isso resolve alguns problemas de DirectX.

Não existe uma única solução para fazer o AutoHotkey funcionar em todos os programas. Se tudo que você tentou não deu certo, talvez não seja possível usar o AutoHotkey para sua necessidade.

## 4 - Executando Programas & Websites

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

    ; Executa um programa. Perceba que a maioria dos programas solicitarão um caminho COMPLETO para o arquivo:
    Run, %A_ProgramFiles%\Some_Program\Program.exe

    ; Executa um Website:
    Run, https://www.autohotkey.com

Existem algumas outras funções avançadas também, como parâmetros de linah de coamndo e CLSID. Se você quiser aprender mais sobre essas coisas, visite a página Run.

Aqui estão mais alguns exemplos:

    ; Vários programas não precisam de um caminho completo para o arquivo, como os programas-padrão do Windows:
    Run, notepad.exe
    Run, mspaint.exe

    ; Executa a pasta "Meus Documentos" usando uma variável embutida:
    Run, %A_MyDocuments%

    ; Run some websites:
    Run, https://www.autohotkey.com
    Run, https://www.google.com

Para informações mais aprofundadas e exemplos, verifique a página Run.

## 5 - Comandos vs. Funções()

O AutoHotkey possui dois tipos principais de coisas usadas pelo scripter para criar códigos: Comandos e Funções.

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

### Comandos

Você pode dizer o que é um comando só de olhar para sua sintaxe (a forma que se parece) Comandos não usam parênteses ao redor dos parâmetros como as funções. Então um comando se parece com algo assim:

    Comando, Parâmetro1, Parâmetro2, Parâmetro3

Quando estiver usando comandos, você não pode espremer outros comandos na mesma linha que o comando anterior (exceção: IfEqual). Você não pode colocar comandos dentro dos parâmetros de outros comandos. Por exemplo:

    MsgBox, Olá Run, notepad.exe   ; INCORRETO
    MsgBox, Olá , Run, notepad.exe  ; INCORRETO

    MsgBox, Olá      ; CORRETO
    Run, notepad.exe

Comandos também se diferem das funções porque eles usam a "sintaxe legado" Isso quer dizer que você precisa colocar sinais de porcentagem ao redor de uma variável, como `%Var%` e quaisquer textos e números não precisam ser envolvidos por aspas, ocmo `Algum texto`. Além disso, você não pode fazer matemática nos parâmetros, ao contrário das funções.

Você pode fazer matemática nos parâmetros se você forçar uma expressão com um único sinal de porcentagem (`%`), mas isso não será abordado.

### Funções

Como dito acima, funções são diferentes porque elas usam parênteses. Uma função comum se parece com isso:

    Função(Parâmetro1, Parâmetro2, Parâmetro3)

Funções possuem algumas princiapais diferenças:

1. Você pode fazer matemática nelas::

       SubStr(37 * 12, 1, 2)
       SubStr(A_Hour - 12, 2)

2. Variáveis não precisam ser envolvidas em sinais de porcentagem:

       SubStr(A_Now, 7, 2)

3. Funções podem ir dentro de funções:

       SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))

4. Textos precisam ser envolvidos em aspas:

       SubStr("Estou codificando, incrível!", 16)

Uma função normalmente retorna um valor de uma forma diferente que os comandos. Comandos precisam de um parâmetro OutputVar, funções não. A maneira mais simples de atribuir o valor de uma função para uma variável é assim:

    MinhaVar := SubStr("Estou codificando, incrível!", 16)

Essa não é a única maneira, mas é a mais comum. Você está usando a `MinhaVar` para armazenar o valor de retorno da função que fica ao lado direito do operador `:=`. Veja Funções para mais detalhes.

Em poucas palavras:

    ; Esses são comandos:
    MsgBox, Isso é um texto.
    StringReplace, Output, Input, AutoHotkey, AutoHotKey, All
    SendInput, Isso é incrível{!}{!}{!}

    ; Essas são funções:
    SubStr("Estou codificando, incrível!", 16)
    FileExist(VariableContainingPath)
    Output := SubStr("Estou codificando, incrível!", 16)

### a. Blocos de código

Blocos de código são linhas de código cercadas por chaves (`{` and `}`). Elas agrupam uma seção de códigos, pois assim o AutoHotkey entende que aquilo tudo faz parte de uma grande família e precisam permanecer juntos. Eles são frequentemente usados com funções e declarações de controle de fluxo como If e Loop. Sem eles, apenas a primeira linha do bloco é chamada.

No código seguinte ambas as linhas são executadas apenas se MinhaVar for igual a 5:

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

No seguinte código, a caixa de diálogo é mostrada apenas se MinhaVarfor igual a 5. O script sempre será encerrado, mesmo se MinhaVar não forigual a 5:

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

Isso é perfeitamente aceitável visto que a declaração if possui apenas uma linha de código associada à ela. Acontece exatamente o mesmo acima, mas eu deixei a segunda linha desalinhada para que saibamos que ela está separada da declaração if:

    if (MinhaVar= 5)
        MsgBox, MinhaVar é igual a %MyVar%!!
    MsgBox, Agora estamos 'fora' da declaração if. Não precisamos de chaves já que existe apenas uma linha abaixo dela.

## 6 - Variáveis

Variáveis são como pequenas notas de post-it que armazenam alguma informação. Elas podem ser usadas para armazenar textos, números, dados de funções e comandos e até mesmo equações matemáticas. Sem elas, programação e scripting seria muito entediante.

Variáveis podem ser atribuídas de algumas maneiras. Iremos abordar as maneiras mais comuns. Por favor, preste atenção ao sinal de igual (`=`).

Atribuição legado de texto

      MinhaVar= Texto

  Essa é a forma mais simples de uma variável, uma atribuição legado. Simplesmente digite seu texto e está feito.

Atribuição legado de variável

      MinhaVar= %MinhaVar2%

  O mesmo que acima, mas você está atribuindo o valor de uma variável para outra.

Atribuição legado mista

      MinhaVar= %MinhaVar2% algum texto %MinhaVar3%.

  Uma combinação das duas atribuições legado mostradas acima.

Atribuição de expressão de texto

      MinhaVar:= "Texto"

  Essa é uma atribuição de expressão, devido ao `:` antes do `=`. Qualquer texto precisa estar dentro de aspas.

Atribuição de expressão de variável

      MinhaVar := MinhaVar2

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

Atribuição de expressão de número

      MinhaVar := 6 + 8 / 3 * 2 - Sqrt(9)

  Graças as expressões você pode fazer matemática!

Atribuição de expressão mista

      MinhaVar := "O valor de 5 + " MinhaVar2" é: " 5 + MinhaVar2

  Uma combinação das três atribuições de expressão acima.

O sinal de igual (=) com um símbolo em sua frente, como `:=` `+=` `-=` `.=` etc. são chamados de operadores de atribuição e sempre exigem uma expressão.

### a. Quando usar porcentagem

Um dos problemas mais comuns com o AutoHotkey envolvendo variáveis é quando usar os sinais de porcentagem (%). Felizmente isso irá esclarecer qualquer confusão.

Quando usar sinal de porcentagem

- Quando você estiver usando comandos (veja acima) exceto quando o parâmetro for OutputVar ou InputVar.
- Quando você estiver atribuindo um valor para uma variável usando o modo legado (um sinal de igual sem símbolo em sua frente).

Quando não usar sinal de porcentagem:

- Em parâmetros que são variáveis de entrada ou saída. Por exemplo: `StringLen, OutputVar, InputVar`
- Do lado esquerdo de uma atribuição: `Var = 123abc`
- Do lado esquerdo de declarações if legado (não-expressão): `if Var1 < %Var2%`
- Em qualquer lugar em expressões. Por exemplo:

        if (Var1 != Var2)
        Var1 := Var2 + 100

### b. Obtendo entrada do usuário

Às vezes você quer que o usuário escolha o valor de alguma coisa. Há várias formas de fazer isso, mas a mais simples é a InputBox. Aqui está um exemplo simples de como perguntar para o usuário algumas coisas e fazer algo com o que foi respondido:

    InputBox, OutputVar, Questão 1, Qual é seu primeiro nome?
    if (OutputVar = "Bill")
        MsgBox, É um nome incrível`, %OutputVar%.

    InputBox, OutputVar2, Questão 2, Você gosta do AutoHotkey?
    if (OutputVar2 = "sim")
        MsgBox, Obrigado pela resposta %OutputVar2%`, %OutputVar%! Nos tornaremos ótimos amigos.
    else
        MsgBox, %OutputVar%`, Isso me deixa triste :(.

### c. Outros Exemplos?

    MsgBox, 4,, Você gostaria de continuar?
    IfMsgBox, Não
        return  ; Se não for escolhido, impede que o código prossiga..
    MsgBox, Você pressionou SIM.  ; Caso contrário, o usuário escolheu sim.

    ; Alguns exemplos mostrando quando usar e não usar sinais de porcentagem:
    Var = Texto  ; Atribui algum texto para uma variável (legado).
    Number := 6  ; Atribui um número para uma variável (expressão).
    Var2 = %Var%  ; Atribui uma variável para outra (legado).
    Var3 := Var  ; Atribui uma variável para outra (expressão).
    Var4 .= Var  ; Acrescenta uma variável para o fim de outra (expressão).
    Var5 += Numero; Adiciona uma variável para outra (expressão).
    Var5 -= Numero  ; Subtrai o valor de uma variável de outra (expressão).
    Var6 := SubStr(Var, 2, 2)  ; Variável dentro de uma função. Isso sempre é uma expressão.
    Var7 = %Var% Text  ; Atribui uma variável para outra com algum texto adicional (legado).
    Var8 := Var " Text"  ; Atribui uma variável para outra com algum texto adicional (expressão).
    MsgBox, %Var%  ; Variável dentro de um comando.
    StringSplit, Var, Var, x  ; Variável dentoro de um comando que usa InputVar e OutputVar.
    if (Numero = 6)  ; Sempre que um IF possui parênteses, ele será uma expressão. Então sem sinais de porcentagem.
    if (Var != Numero)  ; Sempre que um IF possui parênteses, ele será uma expressão.. Então sem sinais de porcentagem.
    if Numero = 6  ; Sem parênteses o IF é legado. No entanto, apenas variáveis do 'lado direito" precisam de sinais de porcentagem.
    if Var1 < %Var2%  ; Sem parênteses o IF é legado. No entanto, apenas variáveis do 'lado direito' precisam de sinais de porcentagem.

## 7 - Objetos

Objetos são uma maneira de organizar seus dados para um uso mais eficiente. Às vezes objetos são chamados de arrays, mas é importante notar uqe todos os arrays são apenas objetos. nós chamamos objetos de diferentes coisas dependendo do motivo pelo qual estamos utilizando-o, mas todos os objetos são o mesmo.

Um objeto é basicamente uma coleção de variáveis. Os nomes das variáveis são conhecidos como "Keys", e os conteúdos das variáveis são os "Values"

Quando você ouve alguém chamando um objeto array ou indexed array, isso normalmente quer dizer que as keys são números sequenciais a partir do 1. Quando você ouve alguém chamando um objeto de associative array, isso significa que as keys são strings (texto) ou números não-sequenciais. Às vezes uma mistura de ambos e números sequenciais também!

Não existem restrições para o uqe uma key ou value pode ser, e eles podem ser até mesmo outros arrays! Quando os valores são arrays também, isso é chamado de nested array, e esses serão explicados mais tarde.

Existe um número de motivos pelo qual você pode querer usar um objeto para alguma coisa. Alguns exemplos:

- Você quer uma lista numerada de coisas, como uma lista de compras (isso seria chamado de indexed array)
- Você quer representar uma grade, possivelmente para um jogo de tabuleiro (isso poderia ser feito com nested objects)
- Você possui uma lista de coisas onde cada coisa possui um nome, como as características de uma fruta (isso seria chamado de associative array)

### a. Criando Objetos

Há algumas maneiras de se criar um objeto, e as mais comuns estão listadas abaixo.

Sintaxe de colchetes

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

  Isso iniciará o que às vezes é chamado de um "array indexado". Um array indexado é um objeto que representa uma lista de itens, numerados a partir do 1 e seguindo adiante. Neste exemplo, o valor `"um"` é armazenado na chave `1` do objeto (também conhecida como index 1), e o valor `17` é armazenado na chave `4` do objeto (também conhecido como 4).

Sintaxe de chaves

      Banana := {"Cor": "Amarela", "Sabor": "Delicioso", "Preço": 3}

  Isso permite que você defina o que às vezes é chamado de um "array associativo". Um array associativo é uma coleção de dados onde cada item possui um nome. Neste exemplo, o valor `"Amarela"` é armazenado na chave `"Cor"` do objeto. Além disso, o valor `3` é armazenado na chave `"Preço"`.

Função Array

      MeuObjeto := Array("um", "dois", "três", 17)

  Isso é equivalente a sintaxe dos colchetes, mas envolvido em uma função.

Função de Objeto

      Banana := Object("Cor", "Amarela", "Sabor", "Delicioso", "Preço", 3)

  Isso é equivalente à sintaxe das chaves, mas envolvida em uma função.

É importante lembrar que cada uma dessas definições criam a mesma coisa (objetos), mas com chaves diferentes.

### b. Usando Objetos

Há muitas maneiras de se usar objetos, incluindo recuperação de valores, definição de valores, adição de valores e mais.

#### Para definir valores:

Notação de Colchetes

      Banana["Em conserva"] := True ; Essa banana está em conserva.. Eww.

  Definir valores em um objeto é tão simples quanto definir o valor de uma variável. Tudo que você precisa fazer é colocar sua notação de colchetes do lado esquerdo de um operador de atribuição de expressão `:=`.

Notação de Ponto

      Banana.Consistencia:= "Mole"

  O mesmo que acima, mas com a notação de ponto.

#### Para recuperar valores:

Notação de Colchetes

      Valor := Banana["Cor"]

  Isso permite que você use uma expressão como a chave para obter o valor do seu objeto. Neste caso, eu usei a simples expressão `"Cor"`, que é (não surpreendentemente) a chave `Cor`. Você receberá uma caixa de diálogo com a palavra "Amarela" porque isso é o nós definimos na chave `Cor` na seção anterior.

Notação de Ponto

      Valor := Banana.Cor

  Isso permite que você use apenas strings literais para 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 adicionar diretamente uma chave e um valor, simplesmente defina uma chave que não existe ainda.

Notação de Ponto

      MeuObjeto := "Brilhante"

  O mesmo que acima, mas com a notação de ponto.

Método InsertAt

      MeuObeto.InsertAt(Index, Valor1, Valor2, Valor3...)

  O index é qualquer chave inteira. Isso deslocará todas as chaves inteiras mais altas para frente pelo número de valores que foram inseridos, mesmo se houverem lacunas (por exemplo, apenas as chaves 1 e 100 existem e você insere um valor na chave 50, isso deslocará 100 para 101).

Método Push

      MeuObjeto.Push(Valor1, Valor2, Valor3...)

  Isso "acrescenta" os valores para o final do array MeuObjeto. Em outras palavras, ele insere os valores na maior chave inteira somando mais um.

#### Para remover chaves e valores:

Eliminando o valor

      Banana.Consistencia:= ""

  A forma mais simples de remover um valor é simplesmente deixá-lo em branco. Você pode fazer isso definindo `""` (isso é conhecido como string vazia. Isso não remove a chave, mas faz com que o valor pareça idêntico á um valor não definido. É possível dizer que a chave ainda existe usando o método HasKey, e ela ainda aparecerá em um loop For.

Método Delete

      ValorRemovido := MeuObjeto.Delete(QualquerChave)

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

      NumeroDeChavesRemovidas = MeuObjeto.Delete(PrimeiraChave, ÚltimaChave)

  Permite que você remova um intervalo de chaves numeradas/inteiras ou strings entre PrimeiraChave e ÚltimaChave. O valor fornecerá o númeor de chaves que foram removidas, o uqe é útil se você possuir uma lacuna entre suas chaves (por exemplo, você especifica chaves de 1 até 4, mas a chave número 2 não existe, isso definirá o NumeroDeChavesRemovidas para 3, visto que apenas 3 chaves estavam lá para serem removidas).

Método Pop

      MeuObjeto.Pop()

  Isso remove a maior chave inteira e retorna o valor. Não existem chaves maiores que sejam afetadas.

Método RemoveAt

      ValorRemovido := MeuObjeto.RemoveAt(Index)

      NumeroDeChavesRemovidas := MeuObjeto.RemoveAt(Index, Comprimento)

  Isso remove todas as chaves a partir do Index até Index + Comprimento - 1 (inclusivo). Se o Length for omitido, o padrão será 1. Depois de remover as chaves que ocupam todas as maiores chaves numeradas/inteiras e movê-las abaixo para preencher a lacuna, o valor de Index + Comprimento agora estaria em Index, se houvesse o mesmo. Isso é parecido com o funcionamento do método InsertAt com vários valores especificados.

## 8 - Outras Dicas Úteis

Alcançamos o final de nossa jornada, meu bom amigo. Espero que você tenha aprendido algo. Mas antes de irmos, aqui estão algumas outras coisas que acredito que você deveria saber. Aproveite!

### a. As misteriosas chaves

Ao longo da documentação você verá esses dois símbolos (`[` e `]`) cercando códigos na caixa de sintaxe amarela no topo da maioria das páginas. Quaisquer coisas dentro dessas chaves são OPCIONAIS. Isso quer dizer uqe essas coisas podem ser deixadas de lado se você não precisar delas. Quando estiver escrevendo seu código, é muito importante NÃO digitar as chaves no seu código.

Na página ControlGetText você verá isso:

    ControlGetText, OutputVar , Control, WinTitle, WinText, ExcludeTitle, ExcludeText

Então você poderia simplesmente fazer isso se quisesse:

    ControlGetText, OutputVar

Ou adicionar mais alguns detalhes:

    ControlGetText, OutputVar, Control, WinTitle

Mas e se você quiser usar ExcludeTitle mas não preencher WinText ou WinTitle? Simples!

    ControlGetText, OutputVar, Control,,, ExcludeTitle

Por favor, perceba que você NÃO PODE IGNORAR parâmetros, mas você pode deixá-los em branco. Se você fosse ignorar `WinTitle, WinText`, ele se pareceria com isso e causaria problemas:

    ControlGetText, OutputVar, Control, ExcludeTitle

### b. Encontrando a versão do AutoHotkey

Execute esse código para ver a versão do seu AutoHotkey:

    MsgBox, %A_AhkVersion%

Ou procure por "AutoHotkey Help File" ou "AutoHotkey.chm" no menu iniciar no diretório que foi instalado.

### c. Tentativa e Erro

Tentativa e erro é a mais comum e efetiva maneira de aprendizado. Ao invés de ficar pedindo por ajuda por cada coisinha, às vezes, gastar algum tempo sozinho (às vezes horas ou dias) e tentar fazer alguma coisa funcionar ajudará você a aprender mais rápido.

Se você tentar alguma coisa e isso não der certo, estude o erro. Então tente resolver seu código. Tente executá0lo novamente. Se você ainda obter um erro, modifique seu código mais um pouco. Continue tentando e falhando até seu código não falhar mais. Você aprenderá muito mais dessa maneira lendo a documentação, lendo erros e aprendendo o que funciona e o que não funciona. Tente, falhe, tente, falhe, tente, tente, tente, falhe, falhe, obtenha êxito!

Foi assim que muitos "pros" aprenderam. Mas não precisa ter medo de pedir por ajuda, nós não mordemos (não tão forte). Aprender leva tempo, os "pros" que você encontra por aí não aprenderam a serem mestres em algumas horas ou dias.

"Se no começo não você conseguir o sucesso, tente, tente e tente novamente." - Hickson, William E.

### d. Indentação

Essa coisa (indentação) é muito importante! Seu código irá funcionar perfeitamente bem sem ela, mas será uma dor de cabeça para você e para os outros lerem seu código. Códigos pequenos (25 linhas ou menos) provavelmente serão simples de se ler sem indentação, mas ficarão desleixados. É recomendável que você aprenda a indentar o mais rápido possível. A indentação não possui estilo definido, mas é melhor que você mantenha tudo consistente.

"O que é indentação?" você pergunta? É simplesmente espaçar e quebrar linhas em seu código para que você possa ver o que é o quê. Pessoas normalmente usam 3 ou 4 espaços ou 1 tab por "nível"

Não indentado:

    if (carro = "velho")
    {
    MsgBox, O carro e realmente velho.
    if (pneus = "careca")
    {
    MsgBox, Não é seguro dirigir esse carro.
    return
    }
    else
    {
    MsgBox, Tome cuidado! Esse carro velho é perigoso de se dirigir.
    }
    }
    else
    {
    MsgBox, Meu Deus, que carro brilhante que você tem aí.
    }

Indentado:

    if (carro = "velho")
    {
        MsgBox, O carro é realmente velho.
        if (pneus = "careca")
        {
            MsgBox, Não é seguro dirigir esse carro.
            return
        }
        else
        {
            MsgBox, Tome cuidado! Esse carro velho é perigoso de se dirigir.
        }
    }
    else
    {
        MsgBox, Meu Deus, que carro brilhante você tem aí.
    }

Veja a página Indentation style para vários estilos e exemplos. Escolha o que você gostar ou aprenda a indentar da forma que você considerar mais fácil de se ler.

### e. Procurando Ajuda

Antes de pedir, tente fazer alguma busca por si mesmo ou tente o código por conta própria. Se isso não produzir nenhum resultado que o satisfaça, leia abaixo.

- Não tenha medo de pedir ajuda, mesmo a pessoa mais inteligente pede a ajuda dos outros.
- Não se acanhe de mostrar o que você tentou, mesmo se você pensa que é bobo.
- Publique qualquer coisa que você tentou.
- Imagine que todos exceto você são maçanetas e não sabem nada. Forneça quantas informações você pode para educar a nós, maçanetas, naquilo que você está tentando fazer. Nos ajude a te ajudar.
- Seja paciente.
- Seja educado.
- Seja aberto.
- Seja gentil.
- Aproveite!

Se você não obter uma resposta imediatamente, espere pelo menos 1 dia (24 horas) antes de pedir por mais ajuda. Nós adoramos ajudar, mas também fazemos isso por livre e espontânea vontade em nosso próprio tempo. Podemos estar trabalhando, dormindo, jogando, com a família ou simplesmente ocupados de mais para ajudar.

E enquanto você espera por ajuda, você pode tentar aprender e fazer por si mesmo. É uma ótima sensação fazer alguma coisa por conta sem ajuda.

### f. Outros Links

Perguntas Frequentes Respondidas (FAQ)