Perguntas Frequentes Respondidas (FAQ)

Tabela de Conteúdos

Sintaxe da linguagem

Solução de Problemas

Tarefas Comuns

Hotkeys, Hostrings e Remapeamento

Sintaxe da linguagem

Quando as aspas são usadas com comandos e seus parâmetros?

Aspas duplas (") possuem um significado especial apenas com expressões.. Em todos os outros lugares elas são tratadas literalmente como se elas fossem caracteres normais. Entretanto, quando um script executa um programa ou documento, o sistema operacional normalmente exige aspas ao redor de qualquer parâmetro de linah de comando que contenha espaços, como neste exemplo: Run, Notepad.exe "C:\Meus Documentos\Lista de Endereços.txt".

Quando exatamente os nomes de variáveis são envolvidos em sinais de porcentagem?

Os nomes de variáveis sempre são envolvidos em sinais de porcentagem, exceto nos casos mostrados em negrito abaixo:

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

If (Var1 <> Var2)
    Var1 := Var2 + 100

Para explicações adicionais sobre como os sinais de porcentagem devem ser usados, veja as páginas Sintaxe Legado e Variáveis Dinâmicas. Sinais de porcentagem também podem ter outros significados:

Quando os sinais de porcentagem e as vírgulas devem ser escapados?

Sinais de porcentagem literais devem ser escapados por meio de uma aspa simples (') Por exemplo: MsgBox A porcentagem atual é de 25`%. vírgulas literais também devem ser escapadas (`,) exceto quando usadas em MsgBox ou o último parâmetro de qualquer comando (neste caso o acento é permitido, mas não necessário).

Quando vírgulas ou sinais de porcentagem são envolvidos em aspas dentro de uma expressão o acento é permitido mas não necessário. Por exemplo: Var := "15%".

Solução de Problemas

O que posso fazer se o AutoHotkey não quer ser instalado?

Erro com o7-zip: Use o 7-zip ou um programa compatível para extrair os arquivos de instalação do instalador EXE, então execute setup.exe ou Installer.ahk (arraste e solte o Installer.ahk no AutoHotkey32.exe).

O Instalador do AutoHotkey vem compactado como um arquivo 7-zip auto-extraível que tenta extrair para o diretório do usuário e executar um script compilado. Às vezes as políticas do sistema ou outros fatores impedem que os arquivos sejam extraídos ou executados. Normalmente, nesses casos a mensagem "7-zip Error" é mostrada. Extrair manualmente os arquivos para um diretório diferente pode ajudar.

Instalação travada: Se a janela de instalação ficar branca ou não aparecer nada, tente uma ou ambas as opções seguintes:

Outro: As sugestões acima abordam a maioria dos problemas comuns. Para assistência adicional, publique nos fóruns.

Com faço para recuperar as opções do clique com o botão direito em arquivos .ahk?

Normalmente se o AutoHotkey estiver instalado, clicar com o botão direito em um arquivo script do Autohotkey (.ahk) deve resultar nas seguintes opções:

Às vezes essas opções são substituídas por definições do perfil de usuário atual, como se o Abrir com fosse usado para alterar o programa padrão para a abertura de arquivos .ahk. Isso pode ser resolvido deletando a seguinte chave de registro:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ahk\UserChoice

Isso pode ser feito aplicando esse patch de registro.

Também pode ser necessário reparar os valores de registro padrão, seja reinstalando o AutoHotkey ou executando o AutoHotkey setup (a partir do menu Iniciar) e selecionando aplicar que fica próximo ao topo da janela.

Por que algumas linhas nunca são executadas no meu script?

Quaisquer linhas que você quiser executar imediatamnete quando o script inicia deve aparecer no topo do script, priorizando a primeira hotkey, hotstring, ou Return. Para detalhes, veja a página seção de auto-execução.

Além disso, uma hotkey que executa mais do que uma linha deve listar sua primeira linha abaixo da hotkey, e não na mesma linha. Por exemplo:

#space::  ; Win+Spacebar
Run Notepad
WinWaitActive Untitled - Notepad
WinMaximize
return

Por que meu script não funciona no Windows xxx mesmo ele tendo funcionado em uma versão anterior?

Há muitas variações desse problema, como:

Se você trocou de sistema operacional, é provável que alguma outra coisa também tenha sido alterada e pode estar afetando seu script. Por exemplo, se você comprou um novo computador, podem haver driver ou outros softwares diferentes instalados. Se você também atualizou para uma nova versão do AutoHotkey, encontre qual versão você possuía antes e verifique o changelog e as notas de compatibilidade.

SoundGet, SoundSet, SoundGetWaveVolume e SoundSetWaveVolume se comportam de maneiras diferentes no Windows Vista e versões posteriores do que em versões anteriores. Em particular, os números dos dispositivos são diferentes e alguns componentes podem estar indisponíveis. O comportamento depende dos drivers de aúdio, que são necessariamente diferentes daqueles que são usados no Windows XP. O script de análise de chip de sompode ser usado para encontrar os números corretos do dispositivo.

Isso também remete a seguinte pergunta:

Como faço para contornar problemas causados pelo User Account Control (UAC)?

O Controle de Conta de Usuário (UAC) é uma causa comum de problemas, especialmente quando se troca o sistema operacional do Windows XP/VISTA/7 para o Vista/7/8/10. Embora ele esteja presente no Windows Vista e posterior, ele está habilitado por padrão em novos sistemas ou instalações e é mais difícil desabilitá-lo no Windows 8 e posteiror.

Por padrão, o UAC protege programas "elevados" (que são programas que estão sendo executados como administrador) de serem automatizados por programas não-elevados, visto que isso permitiria que ele burlassem as restrições de segurança. As hotkeys também são bloqueadas, por exemplo, um programa não-elevado não pode espiar uma entrada destinada para um programa elevado.

O UAC também pode impedir o funcionamento de SendPlay e BlockInput.

As soluções alternativas são as seguintes:

Não posso editar meu script através do ícone de bandeja porque ele não inicia devido a um erro. O que eu faço?

Você precisa resolver o erro em seu script antes de obter seu ícone de bandeja de volta. MAs primeiro, você precisa encontrar o arquivo scirpt.

Procure por AutoHotkey.ahk nos seguintes diretórios:

Se você estiver executando outro Autohotkey executável diretamente, o nome do script depende do executável. Por exemplo, se você estiver executando o AutoHotkeyU32.exe, procure por AutoHotkeyU32.ahk. Note que dependendo das configurações do seus sistema, a parte ".ahk" pode estar oculta, mas o arquivo deve ser um ícone parecido com esse: [H]

Normalmente você pode editar um script clicando com o direito sobre ele e selecionando Edit Script. Se isso não funcionar, você pode abrir o arquivo no Bloco de Notas ou outro editor.

Se você iniciar o AutoHotkey a partir do menu Iniciar ou executar o AutoHotkey.exe diretamente (sem parâmetros de linha de comando), ele procurará por um script nas localizações mostradas acima. Alternativamente, você pode criar um arquivo script (algumacoisa.ahk) em qualquer lugar que quiser, e executar o arquivo script ao invés de executar o AutoHotkey.

Veja também O parâmetro "Script Filename" da linha de comando" e Portabilidade do AutoHotkey.exe.

Como faço para encontrar e resolver erros no meu código?

Para scripts simples, veja a página Depurando um script. Para mostrar o conteúdo de uma variável, use o comando MsgBox ou ToolTip. Para scripts complexos, veja a página Depuração Interativa.

Por que o comando Run não é capaz de iniciar meu jogo ou programa?

Alguns porgramas precisam ser iniciados em seus próprios diretórios (se estiver, isso é o melhor a ser feito) Por exemplo:

Run, %A_ProgramFiles%\Alguma Aplicação\App.exe, %A_ProgramFiles%\Alguma Aplicação

Se o programa que você está tentando iniciar está em >%A_WinDir%\System32 e você está usando o AutoHotkey 32-bit em um sistema 64-bit, o Sistema de Redirecionamento de Arquivo pode estar interferindo. Para solucionar isso, use %A_WinDir%\SysNative no lugar; isso é um diretório virtual visível apenas para programas 32-bit sendo executados em sistemas 64-bit.

Por que os caracteres não-ASCII são mostrados ou enviados incorretamente?

Resposta curta: Salve o arquivo como UTF-8 with BOM.

Embora o AutoHotkey suporte textos Unicode, ele é otimizado para compatibilidade, o que quer dizer que o padrão é a codificação ANSI oa invés da mais internacionalmente recomendada UTF-8. O AutoHotkey não irá reconhecer um arquivo UTF-8 a não ser que ele comece com uma marca de ordem de byte.

Em outras palavras, arquivos UTF-8 que não tem uma marca de ordem de byte são mal interpretados, fazendo com que caracteres não-ASCII sejam decodificados incorretamente. Para resolver isso, salve o arquivo como UTF-8 with BOM ou adicione o alternador de linha de comando /CP65001.

Para salvar como UTF-8 with BOM no Bloco de Notas, selecione UTF-8 a partir do menu Encoding no diálogo Salvar Como.

PAra ler outros arquivos UTF-8 que não possuem uma marca de ordem de byte, use FileEncoding UTF-8-RAW, a opção *P65001 com FileRead, ou "UTF-8-RAW" para o terceiro parêmtro de FileOpen(). O sufixo -RAW pode ser omitido, mas nesse caso quaisquer novos arquivos criados terão uma marca de ordem de byte.

Note que arquivos INI acessados com os comandos padrão INI não suportam UTF-8; eles precisam ser salvos como ANSI ou UTF-16.

Por que as Hotstrings, Send, and Click não têm efeito em certos jogos?

Nem todos os jogos permitem que o AHK envie teclas e cliques ou receba as cores dos pixels.

Mas há algumas alternativas, tente todas as soluções mencionadas abaixo. Se todas essas falharem, talvez não seja possível que o AHK funcione com seu jogo. Às vezes os jogos possuem um hack e uma medida de prevenção de trapaças, como o GameGuard e HackShield. Se eles tiverem, existe uma grande chance que o AutoHotkey não funcione com aqueles jogos.

Como a performance pode ser melhorada para jogos ou em outros momentos em que a CPU está sobre-carregada?

Se as Hotkeys, Clicks, ou Sends de um script estão perceptivelmente mais lentos que o normal enquanto a CPU está sobrecarregada, aumentar a prioridade do processo do script pode ajudar. Para fazer isso, inclua a seguinte linha no topo do script:

Process, Priority, , High

Meu antivírus marcou o AutoHotkey ou um script compilado como um malware. Ele realmente é um vírus?

Embora seja possível que o arquivo esteja infectado, é muito frequente que esses alertas sejam falsos positivos, o que quer dizer que o antivírus está cometendo um engano. Uma sugestão comum é carregar o arquivo para um serviço online como o virustotal ou Jotti e ver o que os outros antivírus têm a dizer. Se estiver em dúvida, você pode enviar o arquivo para o fornecedor do seu software antivírus para confirmação. Isso pode ajudar a nós e outros usuários do AutoHotkey, visto que o fornecedor pode confirmar se é um falso positivo e consertar seu produto para funcionar bem com o AutoHotkey.

Falsos positivos podem ser bem comuns para scripts compilados que foram comprimidos, assim como o UPX (padrão para o AutoHotkey 1.0, mas não 1.1) ou MPRESS (opcional para o AutoHotkey 1.1). Como a instalação padrão do AutoHotkey não inclui um compressor, scripts compilados não são comprimidos por padrão.

Tarefas Comuns

Onde posso encontrar a build oficial ou lançamentos antigos?

Veja a página de download do AutoHotkey.

Posso executar o AHK a partir de um dispositivo USB?

Veja a página Portabilidade do AutoHotkey.exe.

Note que quando você compila um script que usa as bibliotecas de funções auto-incluídas, o AutoHotkey.exe e a pasta Lib devem um nível acima do Ahk2Exe.exe (por exemplo, \AutoHotkey.exe vs \Compiler\Ahk2Exe.exe). Note também que o Ahk2Exe salva as configurações para a seguinte chave de registro:HKCU\Software\AutoHotkey\Ahk2Exe. O compilador por si próprio (Ahk2Exe) não é necessário para executar scripts.

Como a saída de uma operação de linha de comando pode ser recuperada?

Testes mostram que devido a um arquivo de caching, um arquivo temporário pode ser muito rápido para saídas relativamente pequenas. Na verdadeo, se o arquivo for deletado imediatamente após o uso, ele não será gravado no disco. Por exemplo:

RunWait %ComSpec% /c dir > C:\My Temp File.txt
FileRead, VarToContainContents, C:\My Temp File.txt
FileDelete, C:\My Temp File.txt

Para evitar o uso de um arquivo temporário (especialmente se a saída é grande), considere usar o método Shell.Exec() com mostrado nos exemplos para o comando Run.

Como um script pode fechar, pausar, suspender ou recarregar outros scripts?

Primeiro, aqui está um exemplo que fecha outro script:

DetectHiddenWindows On  ; Permite que um script com a janela principal escondida seja detectado.
SetTitleMatchMode 2  ; Dispensa a necessidade de especificar o caminho completo para o arquivo abaixo.
WinClose Script's File Name.ahk - AutoHotkey  ; Atualiza isso para refletir o nome do script (case sensitive).

Para suspender, pausar ou recarregar outro script, substitua a última linha acima por uma dessas:

PostMessage, 0x111, 65305,,, Script's File Name.ahk - AutoHotkey  ; Suspende.
PostMessage, 0x111, 65306,,, Script's File Name.ahk - AutoHotkey  ; Pausa.
PostMessage, 0x111, 65303,,, Script's File Name.ahk - AutoHotkey  ; Recarrega.

Como uma ação repetitiva pode ser parada sem encerrar o script?

Para pausar ou resumir todo o script ao pressionar uma tecla, atribua uma hotkey para o comando Pause como nesse exemplo:

^!p::Pause  ; Pressione Ctrl+Alt+P para pausar. Pressione novamente para resumir.

Para impedir uma ação que está sendo repetida dentro de um Loop, considere os seguintes exemplos funcionais, que são hotkeys que iniciam e param suas próprias ações repetitivas. Em outras palavras, pressionar a hotkey uma vez irá iniciar o Loop. Pressionar a mesma hotkey novamente irá interrompê-lo.

#MaxThreadsPerHotkey 3
#z::  ; Win+Z hotkey (altere essa hotkey para se adequar às suas preferências).
#MaxThreadsPerHotkey 1
if KeepWinZRunning  ; Isso significa que uma tarefa subjacente já está executando o loop abaixo.
{
    KeepWinZRunning := false  ; Sinaliza para que o loop da tarefa pare.
    return  ; Finaliza  essa tarefa para que o tópico abaixo seja resumido e veja a alteração feita pela linha de cima .
}
; Caso contrário:
KeepWinZRunning := true
Loop
{
    ; As próximas quatro linhas são a ação que você quer repetir (atualize-as para se adequarem às suas preferências):
    ToolTip, Pressione Win-Z para parar.
    Sleep 1000
    ToolTip
    Sleep 1000
    ; Mas deixe todo o restante abaixo inalterado.
    if not KeepWinZRunning  ; O usuário sinalizou para o loop parar ao pressionar Win-Z novamente.
        break  ; Para o loop completamente.
}
KeepWinZRunning := false  ; Reinicia a preparação para o próximo pressionamento dessa hotkey.
return

Como a ajuda contexto-sensitiva para o AutoHotkey pode ser usada em qualquer editor?

O Rajat criou este script.

Como detectar quando uma página da web termina de carregar?

Com o Internet Explorer, talvez o método mais confiável seja usar o DllCall() e COM, como demonstrado em www.autohotkey.com/forum/topic19256.html. Em uma nota relacionada, os conteúdos da barra de endereço e a barra de status podem ser recuperadas como o demonstrado em www.autohotkey.com/forum/topic19255.html.

Método antigo e menos confiável: A técnica no seguinte exemplo funcionará com o Internet Explorer para a maioria das páginas. Uma técnica similar que pode funcionar em outros navegadores:

Run, www.yahoo.com
MouseMove, 0, 0  ;Evita que a barra de status mostre um mouse hover link ao invés de "Done" .
WinWait, Yahoo! - 
WinActivate 
StatusBarWait, Done, 30
if ErrorLevel
    MsgBox O tempo atingiu o limite ou a janela foi fechada. 
else 
    MsgBox A página está carregando.

Como datas e momentos podem ser comparados ou manipulados?

O comando EnvAdd pode adicionar ou subtrair uma quantidade de dias, horas, minutos ou segundos de uma time-string que está no formato YYYYMMDDHH24MISS. O seguinte exemplo subtrai 7 dias do tempo especificado: EnvAdd, VarContainingTimestamp, -7, days.

Para determinar a quantidade de tempo entre duas datas ou momentos, veja a página EnvSub, que fornece um exemplo. Além disso, a variável embutida A_Now contém o tempo atual local. Por fim, há muitas variáveis de data/horas embutidas, como também o comando FormatTime para criar uma string temporal personalizada.

Como faço para enviar a data e/ou hora atual?

Use FormatTime ou variáveis embutidas para datas e horas.

Como faço para enviar texto em uma janela que não está ativa ou não está visível?

Use o comando ControlSend.

Como o Winamp pode ser controlado mesmo quando não está ativo?

Veja a página Automatizando o Winamp.

Como os nomes dos botões da Caixa de Diálogo podem ser alterados?

Aqui está um exemplo.

Como faço para alterar o editor padrão, aquele que é acessado através do menu de contexto ou o ícone de bandeja?

Na seção exemplo de Edit você encontrará um script que permite que você altere o editor padrão.

Como faço para salvar os conteúdos do meu GUI de variáveis associadas?

Use o comando Gui Submit. Por exemplo:

Gui, Add, Text,, Coloque algum texto e pressione Submit:
Gui, Add, Edit, vAssociatedVar
Gui, Add, Button,, Submit
Gui, Show
Return

ButtonSubmit:
Gui, Submit, NoHide
MsgBox, Conteúdo do controle de edição: %AssociatedVar%
Return

Posso desenhar alguam coisa com o AHK?

Veja a GDI+ standard library oferecida por tic. Isso também é possível com alguns métodos rudimentares usando GUI, mas de uma forma limitada.

Como faço para iniciar uma ação quando uma janela aparece, fecha ou torna-se [in]ativa?

Use WinWait, WinWaitClose ou WinWait[Not]Active.

Também há soluções de usuário criado como OnWin.ahk e [Como fazer] Hook através do Shell para receber suas mensagens.

Hotkeys, Hostrings e Remapeamento

Como faço para colocar minhas hotkeys e hotstrings em efeito automaticamente sempre que eu iniciar meu computador?

Há diversas maneiras de fazer um script (ou qualquer programa) iniciar automaticamente sempre que você iniciar seu computador. A maneira mais fácil é colocar um atalho para o script na pasta Startup:

  1. Encontre o arquivo script, selecione-o e pressione Control+C.
  2. Pressione Win+R para abrir o Executar. Digite shell:startup e clique em OK ou pressione Enter. Isso abrirá a pasta Startup para o usuário atual. Para abrir a pasta para todos os usuários, digite shell:common startup (embora que, nesse caso, você precisa ser um administrador para prosseguir).
  3. Clique com o botão direito sobre a janela e clique em "Paste Shortcut". Agora o atalho para o script deve estar na pasta Startup.

Estou tendo problemas para fazer meus botões do mouse funcionarem como hotkeys. Algum conselho??

Os botões esquerdo e direito do mouse devem ser atribuídos normalmente (por exemplo, #LButton:: é a hotkey para Win+LeftButton). De uma forma parecida, o botão do meio e o giro da roda do mouse devem ser atribuídas normalmente, exceto em mouses cujo os drivers controlam diretamente esses botões.

O quarto botão (XButton1) e o quinto botão (XButton2) pode ser atribuído se o driver do seu mouse permitir que seus cliques sejam vistos pelo sistema. Se eles não puderem ser visto -- ou se seu mouse possui mais do que cinco botões que você queira usar -- você pode tentar configurar o software que vem com o mouse (às vezes acessível através do Painel de Controle ou o Menu Iniciar) para enviar um pressionamento de tecla sempre que você pressionar um desses botões. Parecendo-se com um pressionamento de tecla ele pode então ser definido como uma hotkey em um script. Por exemplo, se você configurar o quarto botão para enviar Control+F1, você pode configurar indiretamente esse botão como uma hotkey usando ^F1:: em um script.

Se você possui um mouse com cinco botões cujo o quarto e quinto botão não podem ser vistos, você pode tentar alterar o driver do seu mouse para o driver padrão incluído com o Sistema Operacional. Isso assumindo que existe um driver em particular para seu mouse e que você pode viver sem as funções fornecidas pelo seu software personalizado de mouse.

Como as teclas Tab e Space podem ser definidas como hotkeys?

Use os nomes das teclas (Tab e Space) ao invés de seus caracteres. Por exemplo, #Space é Win+Space e ^!Tab é Control+Alt+Tab.

Como as teclas ou botões do mouse podem ser remapeadas para que elas tornem-se teclas diferentes?

Isso é descrito na página remapeamento.

Como faço para detectar o pressionamento duplo de uma tecla ou botão?

Use variáveis embutidas para hotkeys como o seguinte:

~Ctrl::
    if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
        MsgBox double-press
return

Como uma hotkey ou hotstring pode ser exclusiva para certo(s) programa(s)? Em outras palavras, quero que uma certa tecla faça o que normalmente faz, exceto quando uma janela específica estiver ativa.

O melhor método para isso é o #IfWinActive. Por exemplo:

#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Control-A while Notepad is active.

Como uma tecla prefixo de combinação pode ser feita para realizar sua função nativa ao invés de não fazer nada?

Considere o seguinte exemplo, que torna a tecla Numpad0 em uma tecla prefixo:

Numpad0 & Numpad1::MsgBox, Você pressionou Numpad1 enquanto mantinha pressionada a tecla Numpad0.

Agora, para fazer que Numpad0 envie um pressionamento de tecla real da tecla Numpad0 sempre que ela não for usada para iniciar uma hotkey como o mostrado acima, adicione a seguinte hotkey:

 $Numpad0::Send, {Numpad0}

O prefixo $ é necessário para evitar um diálogo de aviso sobre um loop infinito (visto que a hotkey "envia ela mesma"). Além disso, a ação acima ocorre ao mesmo tempo em que a tecla é solta.

Como as teclas de atalho embutidas do Windows, como Win+U (Gerenciador de Utilidade) e Win+R (Executar) podem ser alteradas ou desabilitadas?

Aqui estão alguns exemplos.

Posso usar wildcards ou expressões regulares em Hotstrings?

Use o script criado por polyethene (os exemplos estão inclusos).

Como faço para usar uma hotkey que não está no meu layout de teclado?

Veja a página Special Keys.

Meu teclado numérico possui uma tecla especial 000. É possível torná-la uma hotkey?

Sim. Esse é um script de exemplo que faz que a tecla 000 seja uma tecla de igual. Você pode alterar a ação substituindo a linha Send, = com a(s) linha(s) de sua escolha.