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.
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.
Para um vídeo instrutivo, assista Install and Hello World no YouTube.
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"
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:
^j::
é a hotkey. ^
significaCtrl, j
é a letra J. Tudo ao lado esquerdo de ::
são as teclas que você precisa pressionar.Send, Meu Primeiro Script
é como você send (envia) teclas diretamente. Send
é o comando, tudo depois da vírgula (,) será digitado.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.Para um vídeo instrutivo, assista Install and Hello World no YouTube.
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.
Há várias formas de fazer isso, assumirei que você o possui instalado na localização padrão:
Método 1:
Método 2:
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
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.
À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.
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.
::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.
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 pressionaCtrl+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.
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.
; 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.
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.
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.exeComandos 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.
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:
SubStr(37 * 12, 1, 2) SubStr(A_Hour - 12, 2)
SubStr(A_Now, 7, 2)
SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
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)
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.
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 (=
).
MinhaVar= Texto
Essa é a forma mais simples de uma variável, uma atribuição legado. Simplesmente digite seu texto e está feito.
MinhaVar= %MinhaVar2%
O mesmo que acima, mas você está atribuindo o valor de uma variável para outra.
MinhaVar= %MinhaVar2% algum texto %MinhaVar3%.
Uma combinação das duas atribuições legado mostradas acima.
MinhaVar:= "Texto"
Essa é uma atribuição de expressão, devido ao :
antes do =
. Qualquer texto precisa estar dentro de aspas.
MinhaVar := MinhaVar2
No modo expressão, variáveis não precisam de sinais de porcentagem.
MinhaVar := 6 + 8 / 3 * 2 - Sqrt(9)
Graças as expressões você pode fazer matemática!
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.
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 não usar sinal de porcentagem:
StringLen, OutputVar, InputVar
Var = 123abc
if Var1 < %Var2%
if (Var1 != Var2) Var1 := Var2 + 100
À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 :(.
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.
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:
Há algumas maneiras de se criar um objeto, e as mais comuns estão listadas abaixo.
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).
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"
.
MeuObjeto := Array("um", "dois", "três", 17)
Isso é equivalente a sintaxe dos colchetes, mas envolvido em uma função.
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.
Há muitas maneiras de se usar objetos, incluindo recuperação de valores, definição de valores, adição de valores e mais.
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 :=
.
Banana.Consistencia:= "Mole"
O mesmo que acima, mas com a notação de ponto.
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.
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.
MeuObjeto["NovaChave"] := 3.1415
Para adicionar diretamente uma chave e um valor, simplesmente defina uma chave que não existe ainda.
MeuObjeto := "Brilhante"
O mesmo que acima, mas com a notação de ponto.
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).
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.
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.
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).
MeuObjeto.Pop()
Isso remove a maior chave inteira e retorna o valor. Não existem chaves maiores que sejam afetadas.
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.
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!
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
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.
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.
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.
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.
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.