Como centralizar qualquer janela na tela com o AutoHotKey
Não é muito irritante como, pelo menos no Windows, qualquer janela pode aparecer em qualquer lugar da tela? Essa aleatoriedade diária lhe dá nos nervos e você prefere ter mais controle sobre o posicionamento de suas janelas na tela? Bem, agora você pode, graças ao AutoHotKey.
Neste tutorial, veremos como você pode resolver esse problema com um script AutoHotKey. Vamos construí-lo para que ele mova qualquer janela para o centro da tela ao pressionar uma tecla. Parece doce? Vamos ver como é feito!
Como configurar uma tecla de atalho de centralização de janela com AutoHotKey
Metade da batalha ao criar um script é descobrir como ele funcionará antes mesmo de digitar um único caractere. Então, vamos fazer um plano de ação em inglês simples que vamos "mutar" em um script.
O "problema" que o Windows tem
Windows (como em "as coisas retangulares em nossas telas", não o sistema operacional) tendem a aparecer em qualquer lugar da tela. É uma distração e também pode ser irritante quando acontece repetidamente. Especialmente ao lidar com vários solicitantes aparecendo em pontos diferentes, esperando a entrada do usuário.
A Solução para o Problema
Além de enviar pressionamentos de tecla e cliques do mouse para qualquer janela, o AutoHotKey também pode manipulá-los. Vimos no passado como você pode usar o AutoHotKey para fixar janelas "sempre no topo" usando um atalho de teclado. Desta vez, porém, aproveitaremos as habilidades de manipulação de janela do AutoHotKey para:
- "Ler" o ID da janela ativa.
- Também "ler" suas dimensões (largura e altura).
- "Leia" as dimensões do monitor.
- Combine as dimensões do monitor e da janela para calcular as coordenadas ideais para apresentar a referida janela no centro da tela.
- Mova a janela para essas coordenadas.
Por fim, mapeamos o acima para um atalho. Dessa forma, você pode chamá-lo de "sob demanda" em vez de aplicá-lo em todas as janelas – o que pode interferir em aplicativos e jogos em tela cheia.
Observe que neste tutorial, vamos mergulhar direto no AutoHotKey. Se você não estiver familiarizado com ele e quiser saber mais com antecedência, consulte nosso guia rápido do AutoHotKey para iniciantes.
Primeiro, Configurando a HotKey
Mencionamos como mapeamos a função que criaremos para um atalho. No entanto, provavelmente é melhor se começarmos com essa parte para tirá-la do caminho.
Comece baixando o instalador do site oficial do AutoHotKey. Vá para a versão "atual" em vez da versão beta v2 ou da versão 1.0 obsoleta. Em seguida, instale-o no seu PC.
Inicie o Explorador de Arquivos (a maneira mais rápida é com a combinação de teclas Windows + E) e vá para o caminho em que deseja criar seu script. Com o AutoHotKey instalado, algumas novas opções aparecerão no menu do botão direito. Então, clique com o botão direito do mouse no espaço vazio da janela do Explorador de Arquivos e escolha Novo > Script AutoHotKey.
Dê um nome ao arquivo do seu script, clique com o botão direito nele e edite -o. Se você não estiver usando um aplicativo de edição de texto amigável ao código, como o Visual Studio Code ou o Notepad++, use o Windows Notepad. Evite editores como o Wordpad, que podem adicionar sintaxe inútil (para esse propósito) ao seu "código".
Quando estiver no editor de sua escolha, você verá que seu script AutoHotKey já possui algumas linhas pré-preenchidas na parte superior. Eles estão lá por motivos de estabilidade e compatibilidade. Eles são ajustáveis, mas deixe-os como estão para este tutorial.
"Mova" duas ou três linhas abaixo delas e digite o atalho que iniciará sua função. Você pode criar uma combinação de teclas usando "+" para Shift, "^" para CTRL, "!" para Alt e "#" para a tecla Windows, bem como qualquer tecla "normal" do teclado (letras e números).
Por exemplo, para que a combinação CTRL + Y inicie seu script, use:
^y::
O duplo ":" é como dizer: "ei, AutoHotKey, mapeie a string ou a combinação de teclas à esquerda para tudo à direita".
"Mova" duas ou três linhas abaixo pressionando Enter e digite "return", que marcará o fim da função específica. O resultado completo deve se parecer com o seguinte:
^y::; This is a comment.return
O "; Isto é um comentário." line é exatamente isso, um comentário no "código" do script que o AutoHotKey não executará. Está lá para fins de documentação para marcar o local onde inseriremos o "código" do script nas etapas a seguir.
Se você seguiu nosso guia sobre como criar teclas de atalho específicas de aplicativos com AutoHotKey no passado, neste caso… não. Você quer que sua tecla de atalho de centralização de janela seja "global" para centralizar qualquer janela de qualquer aplicativo. Se você "vinculá-lo" a um aplicativo específico, ele atuará apenas nas janelas desse aplicativo.
Obtenha os detalhes da janela ativa
Queremos que nosso atalho atue na janela ativa e também precisamos de suas dimensões para nossos cálculos. Podemos encontrar esses detalhes com o seguinte:
WinGetTitle, ActiveWindowTitle, AWinGetPos,,, Width, Height, %ActiveWindowTitle%
Substitua a linha de comentário que adicionamos ao script na seção anterior pelas duas linhas acima. O resultado?
- A primeira linha pega o título da janela ativa.
- A segunda linha lê sua largura e altura e as mapeia para as palavras/variáveis "Width" e "Height", que usaremos a seguir para nossos cálculos.
Conseguimos os detalhes da janela ativa, mas também precisamos das dimensões da área visível do monitor para atingir nosso objetivo. Felizmente, descobrir isso é ainda mais fácil.
E a área do monitor primário?
Não precisamos de comandos extras para encontrar a largura e a altura do nosso monitor principal. AutoHotKey vem com duas variáveis predefinidas que já contêm essa informação para nós: "A_ScreenWidth" e "A_ScreenHeight".
Então, quando você os vir na próxima seção, eles já "contêm" a largura e a altura do monitor primário. Não há nada necessário para atribuir os valores corretos a eles. Assim, podemos usá-los diretamente em nossos cálculos.
Tempo para calcular a posição alvo
Podemos incluir os cálculos diretamente nos pontos do script onde precisamos deles. Ainda assim, é mais fácil e melhor para legibilidade se as mapearmos para duas variáveis e depois usarmos essas variáveis em nosso script.
Então, vamos para "TargetX" como a variável que irá conter as coordenadas horizontais e "TargetY" como aquela com as coordenadas verticais onde devemos mover a janela para que ela apareça no centro da tela.
TargetX := (A_ScreenWidth/2)-(Width/2) ; Here we calculate the horizontal window target...TargetY := (A_ScreenHeight/2)-(Height/2) ; ...and here the vertical one.
Vamos decifrar essas linhas em inglês simples:
- "TargetX" e "TargetY" são as duas variáveis.
- ":=" informa ao AutoHotKey que as variáveis devem ser iguais aos resultados dos cálculos à direita e que esses resultados devem ser tratados como números.
- "(A_ScreenWidth/2)" divide a largura total do monitor por dois.
- "(Width/2)" faz o mesmo para a largura da janela ativa.
Com o acima, estamos subtraindo metade da largura da janela ativa da metade da largura da tela. O que resta é o espaço à esquerda da janela – do lado esquerdo da tela até onde a janela deve aparecer. A segunda linha faz o mesmo, mas para a altura.
Agora para reposicionar a janela
Equipados com o conhecimento todo-poderoso adquirido pelos comandos místicos que vimos acima, agora podemos criar nosso encantamento mágico que completará o ritual de teletransporte da janela. Ou, em inglês simples, use o comando "WinMove" do AutoHotKey para mover as janelas pela tela.
WinMove espera que nós a "alimentemos" com pelo menos três informações para fazer sua ação: o título da janela de destino e as coordenadas para onde movê-la. Como já mapeamos essas informações para variáveis, o comando é tão simples quanto:
WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY%
No acima:
- "WinMove" é o comando AutoHotKey que move uma janela.
- "%ActiveWindowTitle%" é a variável onde o título da janela ativa é mapeado.
- "%TargetX%" e "%TargetY%" são as coordenadas horizontais e verticais para onde mover a janela.
Você também pode redimensionar janelas com o WinMove, pular aquelas com trechos de texto específicos em seus títulos ou conteúdo, etc. Como esses recursos estão fora do escopo deste artigo, verifique a documentação oficial do AutoHotKey no comando WinMove para saber mais sobre eles.
O roteiro definitivo
Finalmente, chegamos à parte mais desafiadora de nossa jornada. Prepare-se para a próxima etapa espera que você salve o script e, bem… Execute-o.
Sim, foi isso – o roteiro está completo e não há nada mais a fazer do que experimentá-lo. Use o atalho que você definiu e qualquer janela ativa se moverá para o centro da tela.
O arquivo de script final, conforme aberto em um editor de texto, deve se parecer com isto:
; SendMode Input ; Recommended for new scripts due to its superior speed and reliability.SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.^y:: WinGetTitle, ActiveWindowTitle, A ; Get the active window's title for "targetting" it/acting on it. WinGetPos,,, Width, Height, %ActiveWindowTitle% ; Get the active window's position, used for our calculations. TargetX := (A_ScreenWidth/2)-(Width/2) ; Calculate the horizontal target where we'll move the window. TargetY := (A_ScreenHeight/2)-(Height/2) ; Calculate the vertical placement of the window. WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY% ; Move the window to the calculated coordinates. return
Observe que você pode copiar o script acima, colá-lo no Bloco de Notas ou em um editor de texto semelhante e salvá-lo com uma extensão AHK. Em seguida, "execute", com o AutoHotKey instalado, para centralizar qualquer janela sempre que você pressionar CTRL + Y. Se você não gostar desse atalho, ajuste a linha "^y::" para uma combinação de teclas diferente. Por exemplo, !+c::mapearia a função para a combinação de teclas Shift + Alt + C.
Faixa bônus
Para sua conveniência, decidimos conjurar e incluir um script secundário que será útil para aqueles com configurações de monitor duplo.
Para manter este artigo simplificado, incluímos informações sobre como o script funciona nele na forma de comentários. Você pode removê-los de sua iteração.
A pequena história de como ele difere do script acima é que também adicionamos uma variável PositionToggle e alguma "lógica IF". Em seguida, usamos aqueles para "abrir" a janela entre os monitores. Devemos notar que é uma solução deselegante e "hack-y" para o problema. No entanto, preferimos um código mais simplificado, pois essa abordagem é mais fácil de entender e ajustar para todos que não estão familiarizados com o AutoHotKey.
; SendMode Input ; Recommended for new scripts due to its superior speed and reliability.SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.PositionToggle = 1 ; Use a number as a toggle for marking on which monitor the window should appear.^y:: WinGetTitle, ActiveWindowTitle, A WinGetPos,,, Width, Height, %ActiveWindowTitle% If PositionToggle = 1 ; Check the toggle's state and "do what's between the curly brackets" if it's set to 1 for our primary monitor. { TargetX := (A_ScreenWidth/2)-(Width/2) TargetY := (A_ScreenHeight/2)-(Height/2) PositionToggle = 2 ; "Flick" the toggle so that if we reuse the hotkey, our active window will move to the second monitor. } Else If PositionToggle = 2 ; Have we used the hotkey before, "flicking" the toggle number to the second monitor? Then the script should instead do what's between the following curly brackets instead of the ones above. { SysGet, Mon2, Monitor, 2 ; Get the second monitor's details Mon2Width := Mon2Right - Mon2Left ; Calculate the second monitor's actual width. Mon2Height := Mon2Bottom - Mon2Top ; Calculate the second monitor's actual height. TargetX := (Mon2Width/2)-(Width/2)+A_ScreenWidth ; Calculate where to move the window. Notice that we also add the primary monitor's width since AutoHotKey can't move windows on individual monitors but across their combined "surface". TargetY := (Mon2Height/2)-(Height/2)+Mon2Top ; Calculate the optimal vertical target for moving the window on the second monitor. Like above, the second monitor's vertical details are detected in relation to the primary monitor. Thus, we have to get creative to get an optimal target by acknowledging how the second monitor's top isn't equal to 0 (like the primary one's). PositionToggle = 1 ; Flick the toggle back so that if we reuse the hotkey, the window will move back to the primary monitor. } WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY% ; The actual action, moving the active window to our calculated coordinates. return
Centralize uma janela com uma chave, a maneira mais fácil
E agora você está feito! Se tudo funcionar bem, agora você pode usar sua tecla de atalho recém-configurada para centralizar uma janela a qualquer momento.




