Perguntas Frequentes (FAQ)

Sumário

Sintaxe da Linguagem

Resolução de Problemas em Geral

Tarefas comuns

Hotkeys, Hotstrings e Remapeamento de teclas

Sintaxe da Linguagem

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

Aspas duplas (") têm significado especial somente quando estão dentro de expressões. Em todos os demais lugares, elas são tratadas literalmente como se fossem caracteres normais. Entretanto, quando um script executa um programa ou documento, o sistema operacional geralmente exige aspas em volta de quaisquer parâmetros da linha 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 devem ser envolvidos por sinais de porcentagem?

Nomes de variáveis são sempre envoltos em sinais de porcentagem exceto nos casos ilustrados em negrito abaixo:

Para explicações mais detalhadas de como usar os sinais de porcentagem, veja Sintaxe Legada e Variáveis Dinâmicas. Sinais de porcentagem também podem ter outros significados:

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

Sinais de porcentagem literais devem ser escapados precedendo-os com um acento grave (backtick). Por exemplo: MsgBox A porcentagem atual é de 25`%. Vírgulas literais também devem ser escapadas (`,) exceto quando usados dentro de MsgBox ou como último parâmetro de qualquer comando (caso em que o acento é permitido mas não necessário).

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

Resolução de Problemas em Geral

O que posso fazer quando eu não conseguir instalar o AutoHotkey?

Erro do 7-zip: Use o 7-zip ou um programa compatível para extrair os arquivos de instalação do EXE de instalação, daí execute o arquivo setup.exe ou Installer.ahk (arraste e solte o Installer.ahk sobre o AutoHotkeyU32.exe).

O instalador do AutoHotkey vem empacotado em um arquivo 7-zip que se extrai automaticamente e que tenta extrair o conteúdo para o diretório Temp do usuário e executar um script compilado. Algumas vezes as políticas do sistema ou outros fatores impedem arquivos de serem extraídos ou executados. Normalmente nestes casos a mensagem "Erro do 7-zip" é exibida. Extrair manualmente os arquivos para um diretório diferente pode ajudar.

Travamentos na instalação: Se a janela de instalação aparece em branco ou nem aparece, tente uma ou ambas as soluções a seguir:

Outros problemas: As sugestões acima cobrem a maior parte dos problemas. Para mais assistência, poste nos fóruns.

Como eu restauro as opções do menu contexto do clique com o botão direito para os arquivos .ahk?

Normalmente se o AutoHotkey está instalado, clicar com o botão direito num script do AutoHotkey (arquivo .ahk) deve apresentar as opções a seguir:

Algumas vezes essas opções são sobrescritas por configurações do perfil do usuário atual, como se Abrir Com tivesse sido usada para mudar o programa padrão para abrir arquivos .ahk. Para consertar isso, delete esta chave de registro:

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

Isso pode ser feito aplicando-se este patch do registro.

Também pode ser necessário restaurar os valores padrão do registro, seja reinstalando o AutoHotkey ou executando seu setup (a partir do Menu Iniciar) e selecionando aplicar perto do topo da janela.

Por que algumas linhas do script nunca executam?

Quaisquer linhas que você quiser que sejam executadas imediatamente quando o script inicia devem vir no começo do script, antes da primeira hotkey, hotstring ou Return. Para detalhes, vide seção de autoexecução.

Do mesmo modo, uma hotkey que executa mais que uma linha deve ter sua primeira linha debaixo da hotkey, não na mesma linha. Por exemplo:

#space::  ; Win+Espaço
Run Notepad
WinWaitActive Sem título - Bloco de Notas
WinMaximize
return

Por que meu script não roda no Windows xxx mesmo que tenha funcionado em uma versão anterior?

Há algumas variações desse problema, tais como:

Se você mudou de sistema operacional, é provável que algo mais mudou e que está afetando seu script. Por exemplo, se você adquiriu um novo computador, ele pode ter drivers diferentes ou outros programas instalados. Se você também atualizou para uma versão mais nova do AutoHotkey, descubra qual versão você tinha antes e aí verifique o changelog e as notas de compatibilidade.

SoundGet, SoundSet, SoundGetWaveVolume e SoundSetWaveVolume comportam-se de maneira diferente no Windows Vista e posteriores em relação a versões anteriores do Windows. Em particular, números de dispositivos são diferentes e alguns componentes podem não estar disponíveis. O comportamento depende de drivers de áudio, que são necessariamente diferente daqueles usados no Windows XP. O script de análise de placa de som pode ser usado para encontrar os números de dispositivos corretos.

Também veja a seguinte pergunta:

Como eu contorno problemas causados pelo Controle de Conta de Usuário (UAC)?

By default, User Account Control (UAC) protects "elevated" programs (that is, programs which are running as admin) from being automated by non-elevated programs, since that would allow them to bypass security restrictions. Hotkeys também são bloqueadas, então por exemplo, um programa não elevado não pode espionar a entrada feitas para um programa elevado.

O UAC também impede o funcionamento dos comandos SendPlay e BlockInput.

Soluções de contorno comuns são as seguintes:

Eu não consigo editar meu script pelo ícone da bandeja porque aquele não inicia devido a um erro. O que eu faço?

Você deve reparar o erro em seu script antes que você obtenha seu ícone de bandeja novamente. Mas antes, você deve encontrar o arquivo do script.

Procure por AutoHotkey.ahk nos diretórios seguintes:

Se você está usando outro executável do AutoHotkey diretamente, o nome do script depende do executável. Por exemplo, se você está rodando o executável AutoHotkeyU32.exe, procure por AutoHotkeyU32.ahk. Note que, dependendo das configurações do seu sistema, a parte ".ahk" pode estar oculta, mas o arquivo deverá ter um ícone como [H]

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

Se você executar o AutoHotkey a partir do Menu Iniciar ou executando o arquivo AutoHotkey.exe diretamente (sem parâmetros da linha de comando), ele irá procurar por um script em um dos locais acima. Alternativamente, você pode criar um arquivo de script (algumacoisa.ahk) em qualquer lugar que você quiser, e executar o arquivo de script em vez de abrir o executável do AutoHotkey.

Veja também Parâmetro da Linha de Comando "Nome do Arquivo de Script" e Portabilidade do AutoHotkey.exe.

Como eu posso consertar erros em meu código?

Para scripts simples, veja Depurando um Script. Para exibir o conteúdo de uma variável, use MsgBox ou ToolTip. Para scripts complexos, vide Depuração Interativa.

Por que o comando Run é incapaz de executar meu jogo ou programa?

Alguns programas precisam ser iniciados em seus próprios diretórios (quando em dúvida, costuma ser melhor fazê-lo). Por exemplo:

Run, %A_ProgramFiles%\Um Programa\App.exe, %A_ProgramFiles%\Um programa

Se o programa que você está tentando iniciar está na pasta %A_WinDir\System32% e você está usando AutoHotkey de 32 bits num sistema de 64 bits, o Redirecionador de Arquivos do Sistema pode estar interferindo. Para contornar isso, use %A_WinDir%\SysNative no lugar; esse é um diretório virtual visível somente pelos programas de 32 bits rodando em sistemas de 64 bits.

Por que caracteres do meu script que não sejam ASCII estão sendo exibidos ou enviados incorretamente?

Resposta curta: Salve o arquivo do script como UTF-8 com BOM.

Apesar de o AutoHotkey suportar texto Unicode, ele é otimizado para retrocompatibilidade, o que significa usar a codificação ANSI em vez da internacionalmente recomendada UTF-8. O AutoHotkey não irá reconhecer um arquivo UTF-8 automaticamente a não ser que ele inicie com uma marca de ordem de bytes (BOM — Byte Order Mark).

Em outras palavras, os arquivos UTF-8 que não contêm uma BOM são interpretados erroneamente, causando a decodificação incorreta dos caracteres que não sejam ASCII. Para resolver isso, salve o arquivo como UTF com BOM ou adicione o switch /CP65001 da linha de comando.

Para salvar como UTF-8 com BOM no Bloco de Notas, selecione UTF-8 no menu suspenso Codificação dentro da janela Salvar como.

Para ler outros arquivos UTF-8 que não contêm uma BOM, use o comando FileEncoding UTF-8-RAW, a opção *P65001 com o comando FileRead, ou UTF-8-RAW como terceiro parâmetro da função FileOpen(). O sufixo -RAW pode ser omitido, mas neste caso somente os novos arquivos terão uma marca de ordem de bytes.

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

Por que Hotstrings, Send e Click não têm efeito em alguns jogos?

Nem todos os jogos permitem que o AHK envie pressionamentos de teclas ou cliques ou receba cores de píxeis.

Mas há algumas alternativas; tente todas as soluções abaixo. Se todas estas falharem, então pode não ser possível que o AHK funcione com o seu jogo. Às vezes os jogos têm medidas de prevenção de hack ou cheats, como GameGuard e Hackshield. Se tiverem, haverá uma alta probabilidade de o AutoHotkey não funcionar com esse jogo.

Como posso melhorar o desempenho do meu script durante a execução de jogos ou quando o processador estiver sob forte demanda?

Se as Hotkeys, Clicks ou Sends de um script estão visivelmente mais lentos que o normal enquanto a CPU está sob forte carga, aumentar a prioridade do processo do script pode ajudar. Para fazer isso, inclua a linha a seguir perto do topo do script:

Process, Priority, , High

Meu programa antivírus acusou o AutoHotkey ou um script compilado de ser malware. Ele é mesmo um vírus?

Apesar de ser certamente possível que o arquivo tenha sido infectado, na maioria dos casos esses alertas são falsos positivos, o que significa que o programa de antivírus está equivocado. Uma sugestão comum é enviar o arquivo para um serviço online como virustotal ou Jotti e ver o que outros programas antivírus têm a dizer. Se estiver em dúvida, você pode enviar o arquivo para o fornecedor de seu antivírus para confirmação. Isso também pode ajudar outros usuários do AutoHotkey, já que a empresa do antivírus pode confirmar o arquivo como um falso positivo e consertar o produto deles para conviver de boa com o AutoHotkey.

Falsos positivos podem ser mais comuns para scripts compilados que foram comprimidos, como com UPX (padrão para AutoHotkey 1.0 mas não 1.1) ou MPRESS (opcional para AutoHotkey 1.1). Já que 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 achar o build oficial, ou versões mais antigas?

Vide a página de download do AutoHotkey.

Posso rodar o AHK a partir de um pendrive?

Vide Portabilidade do AutoHotkey.exe.

Observe que quando você compila um script que usa bibliotecas de função incluídas automaticamente, AutoHotkey.exe e a pasta da biblioteca devem estar um nível acima do arquivo Ahk2Exe.exe (ex: \AutoHotkey.exe x \Compiler\Ahk2Exe.exe). Também note que o Ahk2Exe salva as configurações na seguinte chave do registro: HKCU\Software\AutoHotkey\Ahk2Exe. O compilador em si (Ahk2Exe) não é necessário para rodar scripts.

Como posso obter a saída de uma operação da linha de comando?

Testes mostram que devido ao cache de arquivos, um arquivo temporário pode ser bem rápido para pequenas saídas. De fato, se o arquivo for deletado imediatamente depois do uso, ele não costuma ser gravado no disco. Por exemplo:

RunWait %ComSpec% /c dir > C:\Meu Arquivo Temporario.txt
FileRead, VariavelQueContemOConteudo, C:\Meu Arquivo Temporario.txt
FileDelete, C:\Meu Arquivo Temporario.txt

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

Como que um script pode fechar, pausar, suspender ou recarregar outro(s) script(s)?

Primeiro, eis um exemplo que fecha outro script:

DetectHiddenWindows On  ; Permite que a janela principal oculta de um script seja detectada.
SetTitleMatchMode 2  ; Evita a necessidade de especificar o caminho completo do arquivo abaixo.
WinClose NomeDoArquivoDoScript.ahk - AutoHotkey  ; Mude isto para refletir o nome do script (diferencia maiúsculas de minúsculas).

Para suspender, pausar ou recarregar outro script, substitua a linha acima com uma destas:

PostMessage, 0x0111, 65305,,, NomeDoArquivoDoScript.ahk - AutoHotkey  ; Suspend.
PostMessage, 0x0111, 65306,,, NomeDoArquivoDoScript.ahk - AutoHotkey  ; Pause.
PostMessage, 0x0111, 65303,,, NomeDoArquivoDoScript.ahk - AutoHotkey  ; Recarrega.

Como que uma ação que se repete pode ser interrompida sem que eu finalize o script?

Para pausar ou retomar o script inteiro pressionando uma tecla, atribua a hotkey ao comando Pause como neste exemplo:

^!p::Pause  ; Pressione Ctrl+Alt+P para pausar. Pressione de novo para retomar.

Para interromper uma ação que está se repetindo dentro de um Loop, considere o exemplo funcional abaixo, que é uma hotkey que tanto inicia quanto interrompe sua própria ação repetitiva. Em outras palavras, pressionar a hotkey uma vez irá iniciar o Loop. Pressionar a mesma hotkey de novo vai pará-lo.

#MaxThreadsPerHotkey 3
#z::  ; Tecla de atalho Win+Z (mude esta hotkey para adequar às suas preferências).
#MaxThreadsPerHotkey 1
if ManterWinZRodando  ; Isto significa que o fio de execução subjacente já está executando o loop abaixo.
{
    ManterWinZRodando := false  ; Sinalize o loop do fio de execução para parar.
    return  ; Finalize esse fio de execução de tal forma que o que está debaixo irá retomar e virá a mudança feita pela linha acima.
}
; Do contrário:
ManterWinZRodando := true
Loop
{
    ; As próximas quatro linhas são a ação que você quer que repita (altere-as para adequarem-se às suas necessidades):
    ToolTip, Pressione Win-Z de novo para impedir que esta janela fique alertando.
    Sleep 1000
    ToolTip
    Sleep 1000
    ; Mas deixe o resto abaixo do jeito que está.
    if not ManterWinZRodando  ; O usuário sinalizou o loop para parar quando aquele pressionou Win-Z de novo.
        break  ; Libertar-se deste loop.
}
ManterWinZRodando := false  ; Recomeçar em preparação ao próximo pressionamento desta hotkey.
return

Como usar, em qualquer editor, a ajuda sensível ao contexto dos comandos do AutoHotkey?

Rajat criou este script.

Como detectar que uma página da web terminou de ser carregada?

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

Um método mais antigo e menos confiável: a técnica no exemplo a seguir funcionará com o Internet Explorer na maioria das páginas. Uma técnica similar talvez funcione em outros navegadores:

Run, www.yahoo.com
MouseMove, 0, 0  ; Impede que a barra de status exiba um link de sobreposição de cursor em vez de "Concluído".
WinWait, Yahoo! - 
WinActivate 
StatusBarWait, Done, 30
if ErrorLevel
    MsgBox A espera se esgotou ou a janela foi fechada. 
else 
    MsgBox A página terminou de carregar.

Como comparar ou manipular datas e horários?

O comando EnvAdd pode adicionar ou subtrair uma quantidade de dias, horas, minutos ou segundos de uma string de tempo que esteja no formato YYYYMMDDHH24MISS. O exemplo abaixo subtrai 7 dias do horário especificado: EnvAdd, VarContendoOHorario, -7, days.

Para determinar a quantidade de tempo entre duas datas ou horários, veja EnvSub, que contém um exemplo. A variável nativa A_Now também contém o horário local atual. Finalmente, há várias variáveis de data/horário nativas, bem como o comando FormatTime para criar uma string de data/horário personalizada.

Como posso enviar a data e/ou o horário atuais?

Use o comando FormatTime ou as variáveis nativas para data e horário.

Como posso enviar texto para uma janela que não esteja ativa ou visível?

Use ControlSend.

Como posso controlar o Winamp mesmo que a janela dele não esteja ativa?

Vide Automatização do Winamp.

Como alterar os nomes dos botões de uma MsgBox?

Aqui está um exemplo.

Como posso alterar o editor atual, que é acessível por meio do menu contexto ou ícone da bandeja?

Na seção de exemplos do termo Edit você encontrará um script que permite que você mude o editor padrão.

Como posso salvar o conteúdo das variáveis associadas à minha GUI?

Use Gui Submit. Por exemplo:

Gui, Add, Text,, Insira algum texto e pressione Enviar:
Gui, Add, Edit, vVariavelAssociada
Gui, Add, Button,, Enviar
Gui, Show
Return

ButtonEnviar:
Gui, Submit, NoHide
MsgBox, Conteúdo do controle 'edit': %VariavelAssociada%
Return

Como eu desenho alguma coisa com o AHK?

Vide biblioteca padrão GDI+, por tic. Também é possível desenhar por métodos rudimentares usando Gui, mas de forma limitada.

Como posso iniciar uma ação quando uma janela aparece, fecha ou torna-se (in)ativa?

Use WinWait, WinWaitclose ou WinWait[Not]Active.

Também há algumas soluções criadas por usuários como OnWin.ahk e [Como] Enganchar no Shell para receber suas mensagens.

Hotkeys, Hotstrings e Remapeamento de teclas

Como eu ponho minhas hotkeys e hotstrings em funcionamento automaticamente toda vez que eu inicio meu PC?

Existem vários jeitos de fazer com que um script (ou qualquer programa) inicie automaticamente toda vez que você iniciar seu PC. O mais fácil é colocar um atalho para o script na pasta Inicializar:

  1. Encontre o arquivo do script, selecione-o e pressione Ctrl+C.
  2. Pressione Win+R para abrir a janela Executar, daí digite shell:startup e clique OK ou Enter. Isso irá abrir a pasta Inicializar do usuário atual. Se, em vez disso, você quiser abrir a pasta Inicializar comum a todos os usuários, digite shell:common startup (entretanto, neste caso você precisará ser um administrador para proceder).
  3. Clique com o botão direito dentro da janela e clique em "Colar atalho". O atalho para o script deverá agora estar na pasta Inicializar.

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

Os botões esquerdo e direito devem ser atribuíveis normalmente (por exemplo, #LButton:: é a hotkey Win+BotãoDireito). De maneira similar, o botão do meio e o rolar da roda do mouse devem ser atribuíveis normalmente exceto em mouses cujos drivers controlam diretamente tais botões.

O quarto botão (XButton1) e o quinto botão (XButton2) talvez sejam atribuíveis se o driver de seu mouse permitir que seus cliques sejam visíveis pelo sistema. Se eles não puderem ser vistos — ou se seu mouse tem mais de cinco botões que você quer usar — você pode tentar configurar o software que veio com o mouse (às vezes acessível pelo Painel de Controle ou Menu Iniciar) para enviar um pressionamento de tecla toda vez que você pressionar um de tais botões. O dito pressionamento pode então ser definido como uma hotkey em um script. Por exemplo, se você configurar o quarto botão para enviar Ctrl+F1, você pode então indiretamente configurar aquele botão como uma hotkey usando ^F1:: em um script.

Se você tiver um mouse de cinco botões cujo quarto e quinto botões 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 assume que existe um driver para seu mouse em particular e que você pode ficar numa boa sem as funcionalidades extras proporcionadas pelo software personalizado do seu mouse.

Como definir as teclas Tab e Espaço como hotkeys?

Use os nomes das teclas (Tab e Space) em vez de seus caracteres. Por exemplo, #Space e Win+Space e ^!Tab é Ctrl+Alt+Tab.

Como remapear teclas e botões do mouse de forma que eles se tornem teclas diferentes?

Isso está descrito na página de remapeamento de teclas.

Como eu detecto o duplo pressionamento de uma tecla ou botão?

Use variáveis nativas para hotkeys assim:

~Ctrl::
    if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
        MsgBox pressione duas vezes
return

Como posso fazer com que uma hotkey ou hotstring seja exclusiva de certo(s) programa(s)? Em outras palavras, eu quero que determinada tecla funcione normalmente exceto quando uma janela específica está ativa.

O método preferido é #IfWinActive. Por exemplo:

#IfWinActive, ahk_class Notepad
^a::MsgBox Você pressionou Ctrl+A enquanto o Bloco de Notas estava ativo.

Como posso fazer com que uma tecla de prefixo execute sua função nativa em vez de não fazer nada?

Considere o exemplo seguinte, em que a tecla Numpad0 é feita de tecla de prefixo:

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

Agora, para fazer com que a tecla Numpad0 envie um pressionamento real de Numpad0 toda vez que ela não tiver sido usada como uma hotkey como no caso acima, adicione a hotkey a seguir:

 $Numpad0::Send, {Numpad0}

O prefixo $ é necessário para prevenir o aparecimento de um aviso sobre um loop infinito (já que a hotkey "envia ela própria"). Além disso, a ação acima ocorre no momento em que a tecla é solta.

Como posso alterar ou desabilitar as teclas de atalho nativas do Windows, como a Win+U (Gerenciador de Utilitários) ou Win+R (Executar)?

Aqui estão alguns exemplos.

Posso usar caracteres curinga ou expressões regulares em Hotstrings?

Use o script feito pelo polyethene (exemplos inclusos).

Como posso usar uma hotkey que não está presente no layout do meu teclado?

Vide Teclas Especiais.

Meu teclado numérico tem a tecla especial 000. É possível fazer dela uma hotkey?

Sim. Este script de exemplo transforma a tecla 000 uma tecla de “igual”. Você pode alterar a ação substituindo a linha Send, = com a linha(s) de sua escolha.