Windows automatiseren met AutoHotkey

Marco den Teuling
0

Inhoudsopgave

AutoHotkey is een populaire en bijzondere scripttaal voor Windows. Je kunt er willekeurige opdrachten mee laten uitvoeren via een toetsencombinatie, maar ook vensters manipuleren. Daarmee kun je Windows automatisch het werk laten doen.

Het ontbreekt Windows niet aan mogelijkheden om processen te automatiseren. Met batch­bestanden, PowerShell-scripts en de Windows Script Host en bijbehorende talen VBScript en ­JScript kun je bijna alle aspecten beïnvloeden van het besturingssysteem en de bijbehorende configuratie. Een andere scripttaal moet dan ook wat bijzonders bieden. Een alternatief dat daar al jaren succesvol in slaagt is ­AutoHotkey.

Net zoals met de eigen scripttalen van Windows, kun je met AutoHotkey typische scripttaken uitvoeren. Voorbeelden zijn het kopiëren, verplaatsen en wissen van bestanden, registeritems toevoegen en externe programma’s starten met een uitgebreide lijst parameters. Maar AutoHotkey-scripts kunnen ook dingen die je bij andere talen tevergeefs zult zoeken. Zo kun je er vrij eenvoudig scripts mee maken die aanvankelijk helemaal niets doen, maar die zich als pictogram nestelen in het systeemvak. Daar wachten ze tot je de in het script gedefinieerde toetsen­combinatie indrukt. En dan pas worden de geprogrammeerde opdrachten uitgevoerd.

Als AutoHotkey-programmeur beschik je onder andere over functies die muis- en toetsenbordinvoer simuleren. Dat maakt AutoHotkey-scripts ook heel geschikt om bijvoorbeeld lange, telkens identieke procedures in willekeurige programma’s te automatiseren of vervelende dialoogvensters automatisch te laten wegklikken.

AutoHotkey biedt verder functies waarmee je eigenschappen van vensters kunt beïnvloeden. Daarmee kun je vensters met een script bijvoorbeeld nauwkeurig positioneren, van grootte veranderen of naar de voor- of achtergrond verplaatsen. Scripts kunnen zelfs eigen vensters tonen met knoppen, lijsten en invoervakken. Daarmee kunnen gebruikers het script bedienen alsof het een Windows-programma is.

AutoHotkey installeren

AutoHotkey is een opensourceprogramma en kan gratis gedownload worden van de website www.autohotkey.com. Bij het schrijven van dit artikel ging het om versie 1.1.30.03. De ook nog beschikbare versie 1.0.x is alleen nodig als je een heel oud script zou willen ­gebruiken dat niet overweg kan met versie 1.1. Er wordt gewerkt aan versie 2.0, maar die bevindt zich nog in een vroeg stadium en is niet geschikt voor productief gebruik.

Het installeren is snel gedaan en de opties in het set-upprogramma kun je doorgaans accepteren. Auto­Hotkey-scripts zijn eenvoudige tekstbestanden met de extensie .ahk. Je kunt ze in principe met elke teksteditor bewerken, zelfs met Windows’ eigen Kladblok. Maar waarschijnlijk wil je wat meer gebruiksgemak. Het hulpbestand van AutoHotkey bevat een sectie ‘Edit’. Daar staan enkele editors, die syntax-­highlighting en andere handige functies bieden voor scriptontwikkelaars. We hebben goede ervaringen met het programma SciTE4-AutoHotkey. Dat heeft ook een script-debugger en een rudimentaire GUI-editor voor eigen gebruikers­interfaces.

Windows automatiseren AutoHotkey editor script schrijven

Speciaal voor AutoHotkey geschikte editors vergemakkelijken het schrijven van scripts. Het getoonde SciTE4AutoHotkey integreert ook de debugger.

Sneller typen

Voor het eenvoudigste type AutoHotkey-scripts heb je niet eens een aparte editor of enige programmeerkennis nodig. Dat type bestaat uit een willekeurig aantal regels volgens het patroon
::gdh::Geachte dames en heren,
::mvg::Met vriendelijke groet
De AutoHotkey-documentatie noemt dat ‘hotstrings’. Het gaat daarbij om een zelfgekozen afkorting tussen twee paar dubbele punten, gevolgd door de tekst waar het voor staat. Als een script met hotstrings is geladen, houdt AutoHotkey in de gaten of je in een willekeurig venster de betreffende afkorting intypt. Die wordt dan vervangen door de tekst die achter het tweede paar dubbele punten staat.

Standaard moet je de afkorting als apart woord intypen om de hotstring te activeren. Dat betekent dat er een scheidingsteken zoals een spatie, tab, return of leesteken voor moet staan en ook erna getypt moet worden. Welke tekens als scheidingsteken worden herkend, kun je ergens in het script definiëren met de regel
#Hotstring EndChars
Je kunt bovendien de werking van een hotstring aanpassen door tussen de eerste twee dubbele punten een of meer opties toe te voegen in de vorm van speciale tekens. Zo geeft een * aan dat op de afkorting geen scheidings­teken hoeft te volgen en zorgt een ? ervoor dat er geen scheidingsteken vooraf nodig is. Met B0 (met cijfer nul) zorg je ervoor dat de afkorting niet wordt weggehaald voordat de vervanging wordt ingevoegd en een o (de letter o) zorgt ervoor dat niet alleen de afkorting, maar ook het scheidingsteken wordt weggehaald. Meer opties staan in het AutoHotkey-­hulpbestand in de sectie ‘Hotstrings’.

De vervangingstekst mag daarbij speciale tekens bevatten. Zo zal
:o:hgr::Hartelijke groet, {Enter 2} Kees
de invoer ‘hgr’ vervangen door ‘Hartelijke groet,’ gevolgd door twee regeleinden en de naam Kees. Langere teksten die meerdere regels beslaan, kun je ook op die manier invoegen:
::os2::
(
“I believe OS/2 is destined to be the most important operating system, and possibly program, of all time.”
– Bill Gates
)
De vervangende tekst is hierbij alles tussen de regels met het haakje openen en haakje sluiten, zonder de haakjes zelf.

Hotstrings zijn niet alleen bruikbaar voor tekstfragmenten, maar bijvoorbeeld ook voor het corrigeren van gangbare typfouten:
::Windwos::Windows
Bovendien kunnen ze (web)ontwikkelaars het werk vergemakkelijken. Zo zal de regel
:*B0:<div>::</div>{Left 6}
een ingetypte <div>-tag aanvullen met de afsluitende tag en de invoegpositie naar links verplaatsen tot tussen de beide tags. Daarbij zorgt B0 ervoor dat de getypte tekst blijft staan en {Left 6} geeft zesmaal de ‘pijltoets naar links’.

We vergelijken tools voor (puur) tekst automatiseren in c't dec/2019

AutoHotkey oproepen

Het AutoHotkey-installatieprogramma zorgt ervoor dat je .ahk-bestanden eenvoudigweg kunt openen door erop te dubbelklikken in Verkenner. Je kunt de bestandsnaam eventueel ook meegeven als argument bij het starten van AutoHotkey.exe. Dat is bijvoorbeeld handig als je een bepaald script altijd wilt laden bij het starten van Windows. Typ daarvoor shell:startup op de adresbalk van Windows Verkenner om de map Opstarten te openen. Maak daarin een nieuwe snelkoppeling en geef als doel iets op als “C:\Program Files\AutoHotkey\AutoHotkey.exe” “C:\Users\Alice\Documents\MijnScript.ahk”. De specifieke padnamen moet je afstemmen op je situatie.

Als een script hotstrings bevat (of de verderop beschreven hotkeys), dan blijven die na het verwerken van eventuele scriptcode beschikbaar. AutoHotkey blijft actief op de achtergrond en verschijnt als een pictogram in het systeemvak (een witte H op een groene achtergrond). Het snelmenu daarvan bevat de opdracht ‘Exit’, waarmee je het script kunt afsluiten. ‘Suspend Hotkeys’ schakelt alleen het verwerken van hotstrings en hotkeys uit, en met ‘Pause Script’ pauzeer je het hele script tijdelijk.

De overige opdrachten zijn daarbij vooral interessant voor script-ontwikkelaars. ‘Edit This Script’ opent het script in de gekoppelde editor, ‘Reload This Script’ laadt het opnieuw na wijzigingen. Kies je ‘Open’ of dubbelklik je op het pictogram, dan opent er een venster met allerlei diagnostische gegevens.

Windows automatiseren AutoHotkey fout opsporen history logboek

Via het systeemvakpictogram van AutoHotkey heb je toegang tot een vrij kaal venster, dat echter waardevolle gegevens kan tonen bij foutopsporing.

AutoHotkey-scripts

Het is mogelijk om AutoHotkey alleen te gebruiken voor tekstfragmenten en autocorrectie van typ­fouten, maar daarmee benut je lang niet alle mogelijkheden van het programma. Het gaat tenslotte om een scripttaal. Een tussenstap van tekstvervanging richting echt programmeren zijn de dynamische tekstfragmenten. De volgende code vervangt bijvoorbeeld de invoer ‘@d’ bij het typen door de huidige datum:
::@d::
FormatTime, today,, d. MMMM yyyy
SendInput, %today%
return
De eerste regel definieert zoals gebruikelijk de afkorting die ingetypt moet worden. De volgende drie ­regels bestaan uit scriptcode oftewel opdrachten. De Engelstalige documentatie noemt dat ‘commands’. Dat is belangrijk om de taal goed te begrijpen, want AutoHotkey gebruikt twee soorten syntaxis naast elkaar. De met afstand meest gebruikte opdrachten gebruiken nog de oudere syntaxis (‘command syntax’ of traditionele syntaxis). Daarnaast is er een nieuwere syntaxis die bestaat uit functies (‘functions syntax’). Als je al ervaring hebt opgedaan met andere programmeer- of scripttalen, zal de functiesyntaxis waarschijnlijk bekender zijn voor je. Daarom gebruiken we waar dat mogelijk is hierna de modernere syntaxis.

Het grootste verschil tussen de twee soorten zie je bij de tekenvolgorde, variabelennamen en hoe waarden aan variabelen worden toegewezen. Bij de functiesyntaxis kun je bijvoorbeeld schrijven:
name := “Alice”
groet := “Hallo ” . name
De operator voor het toewijzen is := en tekenreeksen moeten tussen aanhalingstekens worden gezet. De punt is de operator om tekenreeksen aan elkaar te plakken. Bij de traditionele syntaxis ziet dat er als volgt uit:
name = Alice
groet = Hallo %name%
Daarbij dient een eenvoudig isteken als toewijzingsoperator. Tekenreeksen krijgen geen aparte notatie, maar variabelennamen moeten dan wel tussen %-tekens worden gezet om de inhoud te benaderen.

Terug naar het datumtekstfragment: FormatTime is een opdracht en gebruikt dus de traditionele syntaxis. Opdrachten bestaan altijd uit de naam van een opdracht en een lijst parameters met een komma als scheidingsteken. Volgens de documentatie heeft Format­Time de volgende definitie:
FormatTime, OutputVar [, YYYYMMDDHH24MISS, Format]
Achter OutputVar schuilt een bijzonderheid die AutoHotkey gebruikt bij veel opdrachten: de opdrachten leveren standaard namelijk geen resultaat terug, in tegenstelling tot functies. Dat wijkt af van wat je misschien kent van andere programmeertalen en van hoe het ook bij Auto­Hotkey zelf werkt (bij de functiesyntaxis). Maar de opge­maakte datum wil je natuurlijk toch bewaren. Daarom geef je bij OutputVar de naam op van een variabele waarin het resultaat bewaard moet worden, bijvoorbeeld today. Bij YYMMDD… geef je de op te maken datum en tijd aan als tekenreeks in het getoonde formaat. Met de laatste parameter Format specificeer je hoe het resultaat moet worden opgemaakt.

De rechte haken rond de tweede en derde para­meter geven aan dat die optioneel zijn. Laat je de ­datum weg, dan gebruikt FormatTime de huidige dag en de huidige tijd. De standaardnotatie voor Format is de tijd gevolgd door de datum, volgens de standaard landinstellingen van Windows. In het voorbeeld gebruiken we een eigen formaat, maar laten we het uitlezen van de tijd over aan het commando. Daarom volgen na het aanroepen met today twee komma’s met daartussen als het ware een lege tekenreeks.

SendInput stuurt toetsenbordsignalen naar het actieve venster dat overeenkomt met de tekenreeks in de eerste parameter. In het voorbeeld is dat de inhoud van de variabele today, die op de regel ervoor is toegewezen.

De opdracht return sluit de macro af en beëindigt de scriptuitvoering. In een script dat alleen de getoonde hotstring bevat, is dat overbodig. Maar doorgaans bevat een script meerdere hotstrings of hotkeys. Dat zijn technisch gezien niets anders dan labels. Zonder een return zou het script gewoon doorlopen en ook de code uitvoeren die bij het volgende item hoort.

Doorlezen is gratis, maar eerst even dit:

Dit artikel is met grote zorg samengesteld door de redactie van c’t magazine – het meest toonaangevende computertijdschrift van Nederland en België. Met zeer uitgebreide tests en praktische workshops biedt c’t de diepgang die je nergens online vindt.

Bekijk de abonnementen   Lees eerst verder

Toetsencombinaties

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 Auto­Hotkey 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 toets­aanslagen altijd, dus ook als het venster van Reken­machine 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 code­blok 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 Reken­machine.

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.

Windows automatiseren AutoHotkey Window Spy venster naam positie

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.

Knippen en plakken

AutoHotkey-scripts kunnen ook iets doen met de inhoud van het Windows-klembord. Misschien kan de volgende hotkey van pas komen:
^+x::
clip := Clipboard
Send, ^x
Send, %clip%
clip := “”
return
Die wacht op de toetsencombinatie Ctrl+Shift+X en voert dan een wisseltruc uit. Daarvoor wordt eerst de inhoud van het klembord opgeslagen (clip := ­Clipboard). Daarna wordt de toetsencombinatie Ctrl­+X naar het actieve venster gestuurd, wat in bijna alle Windows-programma’s de opdracht ‘Knippen’ aanroept. Tot slot wordt de oorspronkelijke inhoud van het klembord naar het actieve venster gestuurd.

Het resultaat van dit script is dat de inhoud van het klembord en de inhoud in de actieve toepassing van plaats verwisseld zijn. Wat in het programma was geselecteerd staat nu op het klembord en is vervolgens vervangen door wat vanuit een (ander) programma naar het klembord was geknipt of gekopieerd. Het afsluitende clip := “” dient alleen om de inhoud van het klembord leeg te maken, want de inhoud die het script heeft gekopieerd kan een willekeurige grootte in beslag nemen.

Script als exe

Als je een handig AutoHotkey-script hebt geschreven, wil je het misschien ook verspreiden onder vrienden of collega’s. Maar het zou niet echt handig zijn als iedereen die je meesterwerk wil gebruiken eerst AutoHotkey moet installeren. Om dat te vermijden, bevat de installatie van AutoHotkey een soort compiler. Die zet het script om naar een exe-bestand, dat naar een andere Windows-pc gekopieerd kan worden en zonder geïnstalleerd te hoeven worden daarop kan worden uitgevoerd.

De scriptcode hoef je daarvoor niet aan te passen, die werkt ongewijzigd. Als je zelf wilt kijken of zo’n script in een exe-bestand zit, kun je de systeemvariabele A_IsCompiled controleren.

Windows automatiseren AutoHotkey compiler script exe AH2exe

Een meegeleverde compiler maakt exe-bestanden van AutoHotkey-scripts. Die draaien op elke pc zonder geïnstalleerd te hoeven worden.

Zelf schrijven!

AutoHotkey biedt veel meer mogelijkheden dan we hier kunnen beschrijven. Als je dieper in de scripttaal wilt duiken, is het zeker handig om de bijgeleverde helptekst door te nemen. Behalve naslaginformatie over alle functies, opdrachten en meer staan daarin ook aanwijzingen voor beginners. Interessant is ook de ‘Script Showcase’: daar bieden de ontwikkelaars grotere, vaak ook gratis beschikbare openbare AutoHotkey-­projecten aan. Die zijn niet alleen praktisch om te gebruiken, maar vaak is de broncode ook beschikbaar en kun je die als inspiratie gebruiken voor je eigen projecten.

Lees uitgebreide info en workshops op je gemak in c't 05/2024

Meer over

Software

Deel dit artikel

Marco den Teuling
Marco den TeulingHad als eerste eigen computer ooit een 16-bit systeem, waar van de 48 kilobyte toch echt niet ‘genoeg voor iedereen’ was. Sleutelt graag aan pc’s, van de hardware tot het uitpluizen van de BIOS-instellingen. Vindt ‘Software as a Service’ een onbedoeld ironische naamgeving.

Lees ook

Spotify streamen naar versterker? Zo doe je het met een Raspberry Pi!

Om Spotify te kunnen streamen naar een niet-smart AV-receiver of analoge versterker die geen muziek-streaming­mogelijkheden heeft, heb je met een Rasp...

Google Gemini gebruiken: dit kun je allemaal met de chatbot van Google

Eerst kon je alleen ChatGPT gebruiken, maar nu is het ook mogelijk om Gemini van Google te gebruiken. Beide chatbots die gebaseerd zijn op AI kunnen w...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er