Hotkeys werken vergelijkbaar met de hotstrings. Die vervangen echter geen getypte tekst, maar reageren op toetsen of toetsencombinaties. Als je bijvoorbeeld regelmatig Windows’ Rekenmachine gebruikt voor berekeningen op facturen, dan kan een hotkey van pas komen die automatisch de btw optelt bij het getoonde bedrag. Als makkelijk te herinneren hotkey zou je de toetsencombinatie Ctrl+Shift+B kunnen kiezen. In AutoHotkey ziet dat er als volgt uit:
^+b::
SendInput, *1,21=
return
Bij een hotkey-definitie ontbreken de twee dubbele punten die je wel ziet bij hotstrings. Verder moet je de juiste tekens gebruiken voor de speciale toetsen. In het voorbeeld zijn dat ^ voor Ctrl en + voor Shift. Daarnaast kun je nog ! voor Alt of # voor de Windows-toets gebruiken. Zodra het script de toetsencombinatie herkent, stuurt het een reeks toetsaanslagen naar het actieve venster. In Rekenmachine zorgt dat er dan voor dat het getoonde getal met 1,21 wordt vermenigvuldigd.
In de eerste vorm verstuurt het script de toetsaanslagen altijd, dus ook als het venster van Rekenmachine helemaal niet actief is. Het zou beter zijn om dat eerst te controleren:
^+b::
if (WinActive(“Rekenmachine”))
{
SendInput, *1,21=
}
return
Bij de getoonde en aanbevolen syntaxis bestaat de controle uit het sleutelwoord if, een voorwaarde tussen haakjes in de vorm van een expressie en een codeblok tussen accolades. De accolades zijn niet nodig als de code maar één regel beslaat, maar voor de overzichtelijkheid is het wel beter ze altijd te gebruiken.
De functie WinActive() controleert of een bepaald venster actief is. Hij verwacht als parameter de typische kenmerken van het venster. In het voorbeeld is dat eenvoudigweg de tekst die staat in de titelbalk van het betreffende venster. De functie levert de waarde 0 terug als het actieve venster niet aan de voorwaarde voldoet, in andere gevallen krijg je de bijbehorende ID. Die ID wordt in dit voorbeeld niet gebruikt, hier is alleen van belang dat if-query’s bij AutoHotkey de waarde 0 of lege tekenreeksen interpreteren als false, alle andere waarden als true.
In het voorbeeld is de if-controle de op één na beste manier om ervoor te zorgen dat de hotkey de uitvoer alleen naar het Rekenmachine-venster stuurt. De controle via een directive is handiger:
#IfWinActive Rekenmachine
^+b::
SendInput, *1,21=
return
Een directive zoals #IfWinActive gebruikt de commandosyntaxis, daarom moet de venstertitel hier niet tussen aanhalingstekens staan. De directive zorgt ervoor dat alle opvolgende hotkey-definities alleen worden verwerkt als bij het indrukken van een toetsencombinatie het opgegeven venster actief is. De if-controle verwerkt daarentegen eerst de toetsencombinatie en bepaalt daarna pas hoe daar op gereageerd moet worden. Dat leidt tot verschillende resultaten als bij een toetsencombinatie een ander venster actief is dan Rekenmachine.
Bij de if-controle accepteert AutoHotkey de toetsencombinatie: als die in het actieve programma een functie heeft, wordt die niet geactiveerd omdat AutoHotkey de toetsinvoer al heeft verwerkt en niet verder doorgeeft. Bij de directive controleert AutoHotkey eerst of het bij het huidige actieve venster wel op de toetsencombinatie moet reageren: als dat niet zo is, komt de toetsencombinatie gewoon aan bij het actieve programma.
Als criterium om te controleren of het actieve venster het juiste is, kan meer dan de venstertitel gebruikt worden. Je kunt bijvoorbeeld ook naar de naam van het exe-bestand of de zogeheten vensterklasse kijken. Om die te bepalen, gaat AutoHotkey vergezeld van het programma Window Spy. Start je dat programma, dan toont het in meerdere velden allerlei informatie over het op dat moment actieve venster, ongeacht de toepassing waarbij het hoort.
Met Window Spy kun je de eigenschappen inspecteren van vensters van andere toepassingen. Je krijgt ook de positie van de muisaanwijzer ten opzichte van beeldscherm of venster te zien.
Het bovenste veld ‘Window Title, Class and Process’ toont de inhoud van de titelbalk, gevolgd door de vensterklasse, de procesnaam en de proces-ID. Elk daarvan kun je als voorwaarde gebruiken. Zo levert
IsWinActive(“ahk_class CabinetWClass”)
true op bij een Verkenner-venster en controleert
IsWinActive(“ahk_exe notepad.exe”)
of het actieve venster bij notepad.exe hoort.
De venstertitel en -klasse zijn niet alleen handig om het actieve venster te controleren, je kunt ze bijvoorbeeld ook gebruiken om na te gaan of een bepaald venster (al dan niet op de achtergrond) is geopend. Dat wordt bijvoorbeeld benut in de volgende hotkey-definitie:
+!v::
if (!WinExist(“ahk_class CabinetWClass”))
{
Run, Explorer
}
else
{
WinActivate
}
return
Dit script wijst aan de toetsencombinatie Shift+Alt+V de volgende functie toe: controleer eerst of er een venster open is dat hoort bij Windows Verkenner. Als dat niet zo is, wordt er een geopend. Anders schakelt WinActivate over naar het gevonden venster. Je hoeft daarbij geen venster te specificeren, want bij aanroepen van WinExist wordt het laatst gevonden venster onthouden en als standaardwaarde gebruikt bij andere opdrachten die een venster als parameter verwachten.