AutoIt: een knop bedienen zonder te klikken
Met ControlClick kun je een knop in een ander venster bedienen zonder zelf te klikken. Dat is handig als een venster op de voorgrond niet fijn werkt, of als je een taak stil op de achtergrond wilt doen. in dezelfde buurt zitten ook WinWait om te wachten tot een venster er is, en ControlGetText om te lezen wat er in een controle staat.
Eerst dit probleem
Soms wil je een programma laten klikken op een knop. Niet met de muis, maar gewoon door AutoIt. Denk aan een knop als OK, Start, Verstuur of Zoek. Dan hoef je niet te wachten tot het venster actief is en hoef je ook niet zelf te klikken.
Dat is handig bij eenvoudige vensters. Maar het gaat niet altijd goed. Sommige programma’s luisteren niet netjes naar gewone venstercommando’s. Dan lijkt ControlClick te werken, maar gebeurt er niets. Soms helpt het ook als het venster wel zichtbaar is, maar dat staat niet los in de bron. De kern is: ControlClick werkt op een controle in een venster, niet op een echte muisklik.
De kern van de oplossing
De bron noemt drie dingen die samen goed werken:
WinWaitwacht tot het venster bestaat.ControlClickklikt op een knop of ander controle-onderdeel.ControlGetTextleest tekst uit een controle.
De volgorde is simpel. Eerst wacht je tot het venster er is. Daarna pak je de controle die je wilt gebruiken. Daarna geef je de klik.Als je wilt controleren of je de goede controle hebt, lees je eerst de tekst uit met ControlGetText.
Wat doet ControlClick precies?
ControlClick stuurt een klik naar een controle in een venster. Je hoeft dus niet per se met de muis naar het venster toe. In de bron staat dat dit bedoeld is om een knop te bedienen zonder handmatig te klikken.
Je werkt dan meestal met:
- de titel van het venster
- soms ook de tekst van het venster
- de naam of id van de controle, zoals een knop
Stap voor stap
Eerst wacht je op het venster. Dat voorkomt dat je script te snel doorgaat. Daarna kun je een controle kiezen.
Een simpele aanpak is deze:
- Wacht op het venster.
- Lees de tekst van de knop of controle.
- Klik op die controle met
ControlClick.
Deze aanpak is fijn als je wilt checken of je op de juiste plek zit. Bijvoorbeeld als een knop soms anders heet of als je zeker wilt weten dat de goede controle wordt gepakt.
Voorbeeldcode
; Wacht op het venster
WinWait("mijn venster")
; Lees tekst uit een controle
Local $sText = ControlGetText("Mijn venster", "", "[CLASSNN:Button1]")
; Klik op de knop
ControlClick("Mijn venster", "", "[CLASSNN:Button1]")
De regels zijn kort en simpel.
WinWait
zorgt ervoor dat het venster er eerst is.
ControlGetText
haalt tekst op uit de controle.
ControlClick
geeft daarna de klik.
Als je het wat duidelijker wilt maken, kun je de controle apart noemen:
Local $sWindow = "Mijn venster"
Local $sControl = "[CLASSNN:Button1]"
WinWait($sWindow)
ConsoleWrite(ControlGetText($sWindow, "", $sControl) & @CRLF)
ControlClick($sWindow, "", $sControl)
Hier zie je goed wat het venster is en wat de controle is. Dat leest vaak fijner als je later nog iets wilt aanpassen.
Wanneer werkt dit wel en wanneer niet?
ControlClick werkt goed als het programma gewone vensteronderdelen gebruikt. Dus een echte knop, vinkje of invoerveld in een standaard venster. Dan kan AutoIt die controle vaak aansturen zonder dat jij handmatig hoeft te klikken.
Het werkt minder goed als:
- het venster nog niet bestaat
- je de verkeerde controle kiest
- het programma geen gewone controles gebruikt
- het venster de klik niet accepteert op deze manier
Daarom is WinWait belangrijk. Zonder wachten loop je snel tegen een fout aan, omdat het venster er nog niet is. en daarom is ControlGetText handig: je kunt eerst kijken of je wel de goede controle te pakken hebt.
handige kleine controle
Als je niet zeker bent van de knop, lees dan eerst de tekst uit. Dat is een simpele check voordat je klikt.
Local $sWindow = "Mijn venster"
local $sControl = "[CLASSNN:Button1]"
WinWait($sWindow)
Local $sButtonText = ControlGetText($sWindow, "", $sControl)
If $sButtonText = "" Then
ConsoleWrite("Geen tekst gevonden op de controle." & @CRLF)
Else
ConsoleWrite("Tekst: " & $sButtonText & @CRLF)
controlclick($sWindow, "", $sControl)
EndIf
Zo voorkom je dat je blind klikt. Dat is handig als je script op meerdere plekken moet werken of als de knop soms anders lijkt te zijn.
Kleine tabel met de drie functies
| Functie | Wat doet het | Waarom handig |
|---|---|---|
WinWait | Wacht tot een venster er is | Voorkomt te vroeg doorgaan |
ControlGetText | Leest tekst uit een controle | Controleert of je de goede knop of regel hebt |
ControlClick | Klikt op een controle | Bedient de knop zonder handmatige klik |
Veelgemaakte fout
De grootste fout is te snel gaan. Het script probeert te klikken terwijl het venster nog niet klaar is. Dan lijkt het alsof AutoIt niets doet.
Een andere fout is de verkeerde controle gebruiken. Een knop kan in AutoIt een andere naam hebben dan je denkt. Daarom is ControlGetText zo handig. Daarmee kun je eerst kijken of je op de juiste controle zit.
Nog iets: ga niet uit van een gewone muisklik.ControlClick is juist bedoeld om de controle direct aan te sturen.Dat is iets anders dan met de muis over het scherm bewegen.
Bevers gedachte
Dit is zo’n techniek die klein lijkt, maar veel gedoe scheelt. Als je vensters netjes kunt wachten, lezen en klikken, wordt je script veel stabieler. En ja, een bever houdt van een stevige tak op de juiste plek 🦫
