Premiers pas avec AutoHotkey
Tags: autohotkey, beginners, french
Published: 2019-11-06 14:58:13

## Trop long / Pas lu

[le code est là](https://github.com/Avalon-Lab/tooling/tree/master/akh_scripts/show_my_console)

## 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](https://extensions.gnome.org/extension-data/screenshots/screenshot_1411_8MWYILj.png)

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 <kbd>²</kbd>. Naïvement j'ai essayé 

```
²::
MsgBox, "vous avez appuyé sur '²'"
return
```
qui produit un joli ![Erreur](https://thepracticaldev.s3.amazonaws.com/i/2cu25efrbfjpvz5rchkj.PNG)

Il faut donc trouver un moyen d'identifier le code correspondant à la touche; la [doc ahk](https://www.autohotkey.com/docs/KeyList.htm#SpecialKeys) sur le sujet est assez claire; il suffit d'ajouter `#InstallKeybdHook` dans mon script et de regarder les logs. 

![capture des frappes clavier](https://thepracticaldev.s3.amazonaws.com/i/29csvafmd7jkcv26my0c.png)

Le code de la touche <kbd>²</kbd> 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](https://thepracticaldev.s3.amazonaws.com/i/y2jkit0jtg69daz2npcr.png)

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:

* [WinActive](https://www.autohotkey.com/docs/commands/WinActive.htm)
* [WinMinimize](https://www.autohotkey.com/docs/commands/WinMinimize.htm)
* [WinActivate](https://www.autohotkey.com/docs/commands/WinActivate.htm)


```
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](https://www.microsoft.com/fr-fr/p/windows-terminal-preview/9n0dx20hk701), 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. 

* <kbd>Win</kbd/> + <kbd>R</kbd> `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 <kbd>²</kbd> ?

Ajoutons un deuxième raccourci : <kbd>Maj</kbd> + <kbd>²</kbd>

```
+SC029::
Send ²
return
```
La liste des modificateurs est [ici](https://www.autohotkey.com/docs/Tutorial.htm#s21)
### 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 <kbd>Win</kbd> + <kbd>1..9</kbd> correspondant au "numéro" de l'app dans la barre des taches