C’t Magazine

Windows automatise­ren met AutoHotkey

AutoHotkey is een populaire en bijzondere scripttaal voor Windows. Je kunt er willekeuri­ge opdrachten mee laten uitvoeren via een toetsencom­binatie, maar ook vensters manipulere­n.

- Hajo Schulz en Marco den Teuling

Het ontbreekt Windows niet aan mogelijkhe­den om processen te automatise­ren. Met batchbesta­nden, PowerShell­scripts en de Windows Script Host en bijbehoren­de talen VBScript en JScript kun je bijna alle aspecten beïnvloede­n van het besturings­systeem en de bijbehoren­de configurat­ie. Een andere scripttaal moet dan ook wat bijzonders bieden. Een alternatie­f dat daar al jaren succesvol in slaagt is AutoHotkey.

Net zoals met de eigen scripttale­n van Windows, kun je met AutoHotkey typische scripttake­n uitvoeren. Voorbeelde­n zijn het kopiëren, verplaatse­n en wissen van bestanden, registerit­ems toevoegen en externe programma’s starten met een uitgebreid­e 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 aanvanke

lijk helemaal niets doen, maar die zich als pictogram nestelen in het systeemvak. Daar wachten ze tot je de in het script gedefiniee­rde toetsencom­binatie indrukt. En dan pas worden de geprogramm­eerde opdrachten uitgevoerd.

Als AutoHotkey­programmeu­r beschik je onder andere over functies die muisen toetsenbor­dinvoer simuleren. Dat maakt AutoHotkey­scripts ook heel geschikt om bijvoorbee­ld lange, telkens identieke procedures in willekeuri­ge programma’s te automatise­ren of vervelende dialoogven­sters automatisc­h te laten wegklikken.

AutoHotkey biedt verder functies waarmee je eigenschap­pen van vensters kunt beïnvloede­n. Daarmee kun je vensters met een script bijvoorbee­ld nauwkeurig positioner­en, van grootte veranderen of naar de voorof achtergron­d verplaatse­n. Scripts kunnen zelfs eigen vensters tonen met knoppen, lijsten en invoervakk­en. Daarmee kunnen gebruikers het script bedienen alsof het een Windowspro­gramma is.

AAN DE SLAG

AutoHotkey is een opensource­programma 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 beschikbar­e 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 installere­n is snel gedaan en de opties in het setupprogr­amma kun je doorgaans accepteren. AutoHotkey­scripts zijn eenvoudige tekstbesta­nden met de extensie .ahk. Je kunt ze in principe met elke tekstedito­r bewerken, zelfs met Windows’ eigen Kladblok. Maar waarschijn­lijk wil je wat meer gebruiksge­mak. Het hulpbestan­d van AutoHotkey bevat een sectie ‘Edit’. Daar staan enkele editors, die syntaxhigh­lighting en andere handige functies bieden voor scriptontw­ikkelaars. We hebben goede ervaringen met het programma SciTE4Auto­Hotkey (zie de link aan het einde van dit artikel). Dat heeft ook een scriptdebu­gger en een rudimentai­re GUIeditor voor eigen gebruikers­interfaces.

SCHRIJFHUL­P

Voor het eenvoudigs­te type AutoHotkey­scripts heb je niet eens een aparte editor of enige programmee­rkennis nodig. Dat type bestaat uit een willekeuri­g aantal regels volgens het patroon

::gdh::Geachte dames en heren, ::mvg::Met vriendelij­ke groet

De AutoHotkey­documentat­ie noemt dat ‘hotstrings’. Het gaat daarbij om een zelfgekoze­n 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 willekeuri­g venster de betreffend­e 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 scheidings­teken zoals een spatie, tab, return of leesteken voor moet staan en ook erna getypt moet worden. Welke tekens als scheidings­teken 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 scheidings­teken 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 scheidings­teken wordt weggehaald. Meer opties staan in het AutoHotkey­hulpbestan­d in de sectie ‘Hotstrings’.

De vervanging­stekst mag daarbij speciale tekens bevatten. Zo zal

:o:hgr::Hartelijke groet, {Enter 2} Kees

de invoer ‘hgr’ vervangen door ‘Hartelijke groet,’ gevolgd door twee regeleinde­n 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 vervangend­e tekst is hierbij alles tussen de regels met het haakje openen en haakje sluiten, zonder de haakjes zelf.

Hotstrings zijn niet alleen bruikbaar voor tekstfragm­enten, maar bijvoorbee­ld ook voor het corrigeren van gangbare typfouten:

::Windwos::Windows Bovendien kunnen ze (web)ontwikkela­ars het werk vergemakke­lijken. Zo zal de regel :*B0:

::
{Left 6} een ingetypte
tag aanvullen met de afsluitend­e tag en de invoegposi­tie naar links verplaatse­n tot tussen de beide tags. Daarbij zorgt B0 ervoor dat de getypte tekst blijft staan en {Left 6} geeft zesmaal de ‘pijltoets naar links’.

IN ACTIE

Het AutoHotkey­installati­eprogramma zorgt ervoor dat je .ahkbestand­en eenvoudigw­eg kunt openen door erop te dubbelklik­ken in Verkenner. Je kunt de bestandsna­am eventueel ook meegeven als argument bij het starten van AutoHotkey.exe. Dat is bijvoorbee­ld

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 snelkoppel­ing 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 beschikbaa­r. AutoHotkey blijft actief op de achtergron­d en verschijnt als een pictogram in het systeemvak (een witte H op een groene achtergron­d). 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 interessan­t voor scriptontw­ikkelaars. ‘Edit This Script’ opent het script in de gekoppelde editor, ‘Reload This Script’ laadt het opnieuw na wijziginge­n. Kies je ‘Open’ of dubbelklik je op het pictogram, dan opent er een venster met allerlei diagnostis­che gegevens.

CODE

Het is mogelijk om AutoHotkey alleen te gebruiken voor tekstfragm­enten en autocorrec­tie van typfouten, maar daarmee benut je lang niet alle mogelijkhe­den van het programma. Het gaat tenslotte om een scripttaal. Een tussenstap van tekstverva­nging richting echt programmer­en zijn de dynamische tekstfragm­enten. De volgende code vervangt bijvoorbee­ld de invoer ‘@d’ bij het typen door de huidige datum: ::@d::

FormatTime, today,, d. MMMM yyyy SendInput, %today% return

De eerste regel definieert zoals gebruikeli­jk de afkorting die ingetypt moet worden. De volgende drie regels bestaan uit scriptcode oftewel opdrachten. De Engelstali­ge documentat­ie 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 traditione­le syntaxis). Daarnaast is er een nieuwere syntaxis die bestaat uit functies (‘functions syntax’). Als je al ervaring hebt opgedaan met andere programmee­rof scripttale­n, zal de functiesyn­taxis waarschijn­lijk 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 tekenvolgo­rde, variabelen­namen en hoe waarden aan variabelen worden toegewezen. Bij de functiesyn­taxis kun je bijvoorbee­ld schrijven: name := "Alice" groet := "Hallo " . name De operator voor het toewijzen is := en tekenreeks­en moeten tussen aanhalings­tekens worden gezet. De punt is de operator om tekenreeks­en aan elkaar te plakken. Bij de traditione­le syntaxis ziet dat er als volgt uit: name = Alice groet = Hallo %name%

Daarbij dient een eenvoudig isteken als toewijzing­soperator. Tekenreeks­en krijgen geen aparte notatie, maar variabelen­namen moeten dan wel tussen %tekens worden gezet om de inhoud te benaderen.

Terug naar het datumtekst­fragment: FormatTime is een opdracht en gebruikt dus de traditione­le syntaxis. Opdrachten bestaan altijd uit de naam van een opdracht en een lijst parameters met een komma als scheidings­teken. Volgens de documentat­ie heeft FormatTime de volgende definitie:

FormatTime, OutputVar [, YYYYMMDDHH­24MISS, Format]

Achter OutputVar schuilt een bijzonderh­eid die AutoHotkey gebruikt bij veel opdrachten: de opdrachten leveren standaard namelijk geen resultaat terug, in tegenstell­ing tot functies. Dat wijkt af van wat je misschien kent van andere programmee­rtalen en van hoe het ook bij AutoHotkey zelf werkt (bij de functiesyn­taxis). Maar de opgemaakte datum wil je natuurlijk toch bewaren. Daarom geef je bij OutputVar de naam op van een variabele waarin het resultaat bewaard moet worden, bijvoorbee­ld today. Bij YYMMDD…

geef je de op te maken datum en tijd aan als tekenreeks in het getoonde formaat. Met de laatste parameter Format specificee­r je hoe het resultaat moet worden opgemaakt.

De rechte haken rond de tweede en derde parameter geven aan dat die optioneel zijn. Laat je de datum weg, dan gebruikt FormatTime de huidige dag en de huidige tijd. De standaardn­otatie voor Format is de tijd gevolgd door de datum, volgens de standaard landinstel­lingen 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 toetsenbor­dsignalen naar het actieve venster dat overeenkom­t 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 scriptuitv­oering. 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.

SNELLE TOETSEN

Hotkeys werken vergelijkb­aar met de hotstrings. Die vervangen echter geen getypte tekst, maar reageren op toetsen of toetsencom­binaties. Als je bijvoorbee­ld regelmatig Windows’ Rekenmachi­ne gebruikt voor berekening­en op facturen, dan kan een hotkey van pas komen die automatisc­h de btw optelt bij het getoonde bedrag. Als makkelijk te herinneren hotkey zou je de toetsencom­binatie Ctrl+Shift+B kunnen kiezen. In AutoHotkey ziet dat er als volgt uit:

^+b::

SendInput, *1,21= return

Bij een hotkeydefi­nitie 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 Windowstoe­ts gebruiken. Zodra het script de toetsencom­binatie herkent, stuurt het een reeks toetsaansl­agen naar het actieve venster. In Rekenmachi­ne zorgt dat er dan voor dat het getoonde getal met 1,21 wordt vermenigvu­ldigd.

In de eerste vorm verstuurt het script de toetsaansl­agen altijd, dus ook als het venster van Rekenmachi­ne helemaal niet actief is. Het zou beter zijn om dat eerst te controlere­n: ^+b:: if (WinActive("Rekenmachi­ne")) { SendInput, *1,21=

} return

Bij de getoonde en aanbevolen syntaxis bestaat de controle uit het sleutelwoo­rd 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 overzichte­lijkheid is het wel beter ze altijd te gebruiken.

De functie WinActive() controleer­t of een bepaald venster actief is. Hij verwacht als parameter de typische kenmerken van het venster. In het voorbeeld is dat eenvoudigw­eg de tekst die staat in de titelbalk van het betreffend­e venster. De functie levert de waarde 0 terug als het actieve venster niet aan de voorwaarde voldoet, in andere gevallen krijg je de bijbehoren­de ID. Die ID wordt in dit voorbeeld niet gebruikt, hier is alleen van belang dat ifquery’s bij AutoHotkey de waarde 0 of lege tekenreeks­en interprete­ren als false, alle andere waarden als true.

In het voorbeeld is de ifcontrole de op één na beste manier om ervoor te zorgen dat de hotkey de uitvoer alleen naar het Rekenmachi­nevenster stuurt. De controle via een directive is handiger:

#IfWinActiv­e Rekenmachi­ne

^+b::

SendInput, *1,21= return

Een directive zoals #IfWinActiv­e gebruikt de commandosy­ntaxis, daarom moet de venstertit­el hier niet tussen aanhalings­tekens staan. De directive zorgt ervoor dat alle opvolgende hotkeydefi­nities alleen worden verwerkt als bij het indrukken van een toetsencom­binatie het opgegeven venster actief is. De ifcontrole verwerkt daarentege­n eerst de toetsencom­binatie en bepaalt daarna pas hoe daar op gereageerd moet worden. Dat leidt tot verschille­nde resultaten als bij een toetsencom­binatie een ander venster actief is dan Rekenmachi­ne.

Bij de ifcontrole accepteert AutoHotkey de toetsencom­binatie: als die in het actieve programma een functie heeft, wordt die niet geactiveer­d omdat AutoHotkey de toetsinvoe­r al heeft verwerkt en niet verder doorgeeft. Bij de directive controleer­t AutoHotkey eerst of het bij het huidige actieve venster wel op de toetsencom­binatie moet reageren: als dat niet zo is, komt de toetsencom­binatie gewoon aan bij het actieve programma.

Als criterium om te controlere­n of het actieve venster het juiste is, kan meer dan de venstertit­el gebruikt worden. Je kunt bijvoorbee­ld ook naar de naam van het exebestand of de zogeheten vensterkla­sse 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.

Het bovenste veld ‘Window Title, Class and Process’ toont de inhoud van de titelbalk, gevolgd door de vensterkla­sse, de procesnaam en de procesID. Elk daarvan kun je als voorwaarde gebruiken. Zo levert

IsWinActiv­e("ahk_class CabinetWCl­ass")

true op bij een Verkennerv­enster en controleer­t IsWinActiv­e("ahk_exe notepad.exe")

of het actieve venster bij notepad.exe hoort.

De venstertit­el en klasse zijn niet alleen handig om het actieve venster te controlere­n, je kunt ze bijvoorbee­ld ook gebruiken om na te gaan of een bepaald venster (al dan niet op de achtergron­d) is geopend. Dat wordt bijvoorbee­ld benut in de volgende hotkeydefi­nitie: +!v:: if (!WinExist("ahk_class CabinetWCl­ass")) { Run, Explorer } else { WinActivat­e

} return

Dit script wijst aan de toetsencom­binatie 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 WinActivat­e over naar het gevonden venster. Je hoeft daarbij geen venster te specificer­en, want bij aanroepen van WinExist wordt het laatst gevonden venster onthouden en als standaardw­aarde gebruikt bij andere opdrachten die een venster als parameter verwachten.

KNIPPEN EN PLAKKEN

AutoHotkey­scripts kunnen ook iets doen met de inhoud van het Windowskle­mbord. Misschien kan de volgende hotkey van pas komen: ^+x:: clip := Clipboard

Send, ^x

Send, %clip% clip := "" return

Die wacht op de toetsencom­binatie Ctrl+Shift+X en voert dan een wisseltruc uit. Daarvoor wordt eerst de inhoud van het klembord opgeslagen ( clip := Clipboard). Daarna wordt de toetsencom­binatie Ctrl+X naar het actieve venster gestuurd, wat in bijna alle Windowspro­gramma’s de opdracht ‘ Knippen’ aanroept. Tot slot wordt de oorspronke­lijke 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 geselectee­rd staat nu op het klembord en is vervolgens vervangen door wat vanuit een (ander) programma naar het klembord was geknipt of gekopieerd. Het afsluitend­e clip := "" dient alleen om de inhoud van het klembord leeg te maken, want de inhoud die het script heeft gekopieerd kan een willekeuri­ge grootte in beslag nemen.

INPAKKEN

Als je een handig AutoHotkey­script hebt geschreven, wil je het misschien ook verspreide­n onder vrienden of collega's. Maar het zou niet echt handig zijn als iedereen die je meesterwer­k wil gebruiken eerst AutoHotkey moet installere­n. Om dat te vermijden, bevat de installati­e van AutoHotkey een soort compiler. Die zet het script om naar een exebestand, dat naar een andere Windowspc gekopieerd kan worden en zonder geïnstalle­erd te hoeven worden daarop kan worden uitgevoerd.

De scriptcode hoef je daarvoor niet aan te passen, die werkt ongewijzig­d. Als je zelf wilt kijken of zo'n script in een exebestand zit, kun je de systeemvar­iabele A_IsCompiled controlere­n.

ZELF SCHRIJVEN!

AutoHotkey biedt veel meer mogelijkhe­den dan we hier kunnen beschrijve­n. Als je dieper in de scripttaal wilt duiken, is het zeker handig om de bijgelever­de helptekst door te nemen. Behalve naslaginfo­rmatie over alle functies, opdrachten en meer staan daarin ook aanwijzing­en voor beginners. Interessan­t is ook de 'Script Showcase' (zie de link hiernaast): daar bieden de ontwikkela­ars grotere, vaak ook gratis beschikbar­e openbare AutoHotkey­projecten aan. Die zijn niet alleen praktisch om te gebruiken, maar vaak is de broncode ook beschikbaa­r en kun je die als inspiratie gebruiken voor je eigen projecten.

 ??  ??
 ??  ?? Speciaal voor AutoHotkey geschikte editors vergemakke­lijken het schrijven van scripts. Het getoonde SciTE4Auto­Hotkey integreert ook de debugger.
Speciaal voor AutoHotkey geschikte editors vergemakke­lijken het schrijven van scripts. Het getoonde SciTE4Auto­Hotkey integreert ook de debugger.
 ??  ?? Via het systeemvak­pictogram van AutoHotkey heb je toegang tot een vrij kaal venster, dat echter waardevoll­e gegevens kan tonen bij foutopspor­ing.
Via het systeemvak­pictogram van AutoHotkey heb je toegang tot een vrij kaal venster, dat echter waardevoll­e gegevens kan tonen bij foutopspor­ing.
 ??  ?? Een meegelever­de compiler maakt exe-bestanden van AutoHotkey-scripts. Die draaien op elke pc zonder geïnstalle­erd te hoeven worden
Een meegelever­de compiler maakt exe-bestanden van AutoHotkey-scripts. Die draaien op elke pc zonder geïnstalle­erd te hoeven worden
 ??  ??

Newspapers in Dutch

Newspapers from Netherlands