DEV Community

Marceau "XioRcaL" Lacroix for Avalon Lab

Posted on • Updated on

Premiers pas avec AutoHotkey

Trop long / Pas lu

le code est là

Problématique de base

Suite à changement d'environnement de boulot (poste de dev linux -> windows) j'ai besoin de retrouver certaines habitudes et notamment

Tilix quake like console

Oui je fais partie de ces gens qui ont besoin d'un terminal à portée d'une touche de clavier. Sauf qu’apparemment sous Windows ce fonctionnement n'existe pas. Depuis j'ai appris que c'était plus ou moins possible, voir la section alternative en bas de l'article.

C'est quoi AutoHotkey ?

D'après leur site web c'est The ultimate automation scripting language for Windows. Ça a l'air plutôt cool présenté comme ça ! Et effectivement ahk permet aussi bien de simuler un clic souris que d'utiliser des dll windows. Sur le papier ça devrait permettre de résoudre le problème.

Le script

Cibler la touche de déclenchement

En temps normal c'est assez facile avec akh, il suffit d'écrire Matouche:: pour déclencher une action

j::
MsgBox, "vous avez appuyé sur 'j'"
return

Sauf que moi j'ai envie d'utiliser ma touche ². Naïvement j'ai essayé

²::
MsgBox, "vous avez appuyé sur '²'"
return

qui produit un joli Erreur

Il faut donc trouver un moyen d'identifier le code correspondant à la touche; la doc ahk sur le sujet est assez claire; il suffit d'ajouter #InstallKeybdHook dans mon script et de regarder les logs.

capture des frappes clavier

Le code de la touche ² est donc SC029; essayons ça :

SC029::
MsgBox, "vous avez appuyé sur '²'"
return

et ça marche! (il faut utiliser un encodage utf8 avec BOM pour avoir les caractères spéciaux affichés correctement)

La base : basculer sur une fenêtre existante

Maintenant il faut identifier la fenêtre cible et la rendre active. Pour ça le mode 'Window Spy' est très pratique, il permet d'afficher le titre, la classe, l'executable et le pid de la fenêtre active.

window spy du terminal

L'algo qu'on cherche à implémenter en pseudo code donnerait quelque chose comme

Si fenêtre active = terminal
  minimiser
  réactiver ancienne fenêtre
sinon
  sauvegarder ancienne fenêtre
  activer la fenêtre terminal

Pour ça on va se servir des fonctions ahk suivantes:

previous_active := ""

SC029::
  if WinActive("ahk_exe WindowsTerminal.exe") {
      WinMinimize, ahk_exe WindowsTerminal.exe
      if (previous_active) {
          WinActivate, ahk_id %previous_active%
      }
  } else {
      previous_active := WinExist("A")
      WinActivate, ahk_exe WindowsTerminal.exe
  }
return

Et si mon terminal est fermé ?

Là encore c'est assez simple, run, C:\PATH_TO_MY_APP\app.exe devrait faire le job. Mais comme mon terminal vient du windows store, je n'ai pas de lien direct pour l’exécutable. J'ai trouvé une astuce qui consiste à créer un raccourci pour l'appli en question et référencer le raccourci dans le script.

  • Win + R shell:appsFolder
  • clic droit créer un raccourci
  • run, path\to\raccourci
previous_active := ""

SC029::
if WinExist("ahk_exe WindowsTerminal.exe") {
    if WinActive("ahk_exe WindowsTerminal.exe") {
        WinMinimize, ahk_exe WindowsTerminal.exe
        if (previous_active) {
            WinActivate, ahk_id %previous_active%
        }
    } else {
        previous_active := WinExist("A")
        WinActivate, ahk_exe WindowsTerminal.exe
    }
} else{
    previous_active := WinExist("A")
    run, C:\PATH_TO\terminal_shortcut
}
return

Pratique, mais si j'ai besoin de taper un ² ?

Ajoutons un deuxième raccourci : Maj + ²

+SC029::
Send ²
return

La liste des modificateurs est ici

Bonus

  • une icône plus jolie :
I_Icon = C:\PATH_TO\icon.ico
IfExist, %I_Icon%
  Menu, Tray, Icon, %I_Icon%

Alernatives

  • En épinglant une appli à la barre des taches il est possible de reproduire l'ouverture/basculement. Il suffit d'appuyer sur Win + 1..9 correspondant au "numéro" de l'app dans la barre des taches

Top comments (0)