PixelSearch: check of een scherm klaar is met vastlopen
Soms wil je in AutoIt niet op een knop klikken op een vaste tijd.Je wilt eerst zien wat er op het scherm staat. Daar helpt
PixelSearch
bij.Die functie zoekt naar een pixel met een bepaalde kleur in een stukje scherm. Als die kleur er is, kun je verder gaan. Zo niet,dan wacht je nog even met
Sleep
.
Wanneer heb je dit nodig?
Dit is handig als een app traag is of als een scherm pas later klaar is. denk aan een venster dat eerst nog laadt,of een knop die pas actief wordt als een kleur op het scherm verandert. Je kijkt dan niet naar tijd alleen,maar naar wat het scherm echt laat zien. Dat is vaak slimmer dan blind wachten. een vaste
sleep(5000)
kan te kort zijn of juist veel te lang. Met
PixelSearch
check je een duidelijk teken op het scherm.
Hoe werken coördinaten?
PixelSearch
werkt met coördinaten. Dat zijn de x- en y-plek op het scherm.X is links naar rechts. Y is boven naar beneden. Links boven is vaak
0, 0
. Je geeft aan in welk stuk van het scherm AutoIt mag zoeken. Bijvoorbeeld van
0,0
tot
400,300
. Dat is een rechthoek op het scherm. Zo zoekt AutoIt niet overal,maar alleen daar waar jij iets verwacht. Er is nog iets belangrijks:
CoordMode
. Daarmee kies je hoe AutoIt de plekken telt. Voor schermwerk is het vaak handig om schermcoördinaten te gebruiken. Dan tel je vanaf het hele scherm, niet vanaf een apart venster.
De kern van de oplossing
De bron zegt het simpel: gebruik
PixelSearch
,
Sleep
en
CoordMode
om schermstatus te herkennen. De idee is:
- Zet de juiste coördinatenstand met
CoordMode. - Zoek naar een kleur in een deel van het scherm.
- Vind je de kleur niet, wacht even met
Sleep. - Probeer het opnieuw.
De kleur moet wel echt passen bij het scherm dat je ziet. Een kleine verandering in kleur kan al genoeg zijn om iets niet te vinden. Soms helpt het om met een iets groter gebied te zoeken.
| Onderdeel | Wat doet het? |
|---|---|
CoordMode | Bepaalt hoe AutoIt de x- en y-plekken leest |
PixelSearch | Zoekt naar een kleur in een schermgebied |
Sleep | Pauzeert even voordat je nog eens kijkt |
Voorbeeld met uitleg
Hier is een veilig voorbeeld. Het doet niets gevaarlijks. Het zoekt alleen naar een kleur op een deel van het scherm en stopt als die kleur gevonden is.
; Kijk naar scherm-coördinaten
Opt("PixelCoordMode", 1)
; Zoekgebied op het scherm
Local $iLeft = 0
local $iTop = 0
Local $iRight = 400
Local $iBottom = 300
; Kleur die je verwacht
Local $iColor = 0xAABBCC
; Rustig opnieuw kijken
While 1
Local $aPos = PixelSearch($iLeft, $iTop, $iRight, $iBottom, $iColor)
if Not @error Then
; Kleur gevonden, dus volgende stap mag verder
ExitLoop
EndIf
Sleep(200)
WEnd
Wat gebeurt hier?
Opt("PixelCoordMode", 1)zet de pixel-stand op schermcoördinaten.PixelSearch(...)zoekt naar de kleur0xAABBCC.- Als de kleur er is, dan werkt
@errorniet meer als foutmelding en stopt de lus. - Is de kleur er nog niet,dan wacht het script
200milliseconden.
Stap voor stap in het echt
Stel, je wacht op een app die pas klaar is als een deel van het scherm een vaste kleur heeft. Dan pak je dit meestal zo aan.
1. Kies een duidelijk punt
Zoek een plek die echt iets zegt over de status. Dat kan een knop zijn die actief wordt, of een vlak dat van kleur verandert als een scherm klaar is. Kies liever niet een heel klein stukje met veel verschil.Een groot en duidelijk vlak werkt vaak beter.
2. Zet het zoekgebied klein genoeg
Hoe kleiner het gebied, hoe sneller het zoeken gaat. Zoek dus niet het hele scherm als dat niet nodig is. Kijk alleen waar die kleur kan staan.
3. Wacht kort tussen de pogingen
Met
Sleep
geef je het scherm even rust. Zonder dat kan je script te vaak en te snel kijken. Dan gebruik je veel CPU voor niets.
4. Stop als je de kleur vindt
Dan kun je verder met de volgende stap. Doe dat pas als het scherm echt klaar is. Dat voorkomt klikken op iets dat nog niet bruikbaar is.
Veelgemaakte fout
Een veelgemaakte fout is dat mensen de verkeerde coördinaten gebruiken. Dan zoekt AutoIt wel, maar niet op de plek die jij bedoelt. Dat lijkt op een fout in
PixelSearch
, terwijl het vaak een meetfout is. nog een fout: de kleur klopt net niet. Schermen en vensters kunnen anders kleuren tonen door thema, schaal of lichte verandering in het beeld. Als de kleur niet gevonden wordt, kijk dan eerst of je de juiste kleur hebt gekozen. ook kan het gebied te klein zijn. Dan mist AutoIt het punt net. Maak het zoekvlak dan iets groter.
Handige variant
soms wil je niet meteen stoppen bij de eerste mislukte check. Je wilt een simpele timeout. Dat is een maximale wachttijd. Zo blijft je script niet eindeloos hangen.
Opt("PixelCoordMode", 1)
Local $iStart = TimerInit()
Local $iTimeout = 10000 ; 10 seconden
Local $iColor = 0xAABBCC
While TimerDiff($iStart) < $iTimeout
local $aPos = PixelSearch(0, 0, 400, 300, $iColor)
If Not @error Then
ExitLoop
EndIf
Sleep(200)
WEnd
If @error Then
; Kleur niet gevonden binnen de tijd
; hier kun je veilig stoppen of een foutstap doen
EndIf
Deze variant is fijn als een scherm soms vastloopt of lang nodig heeft. Dan wacht je niet oneindig. Je houdt zelf de grens in de hand.
Kleine test om goed te kijken
Als je dit gaat gebruiken, test dan eerst handmatig welke kleur je zoekt. Kijk of die kleur echt op het scherm verschijnt op het moment dat je wilt doorgaan. test ook of je zoekgebied klopt. Een simpele check:
- staat het juiste venster op het scherm?
- ligt het zoekvlak op de goede plek?
- klopt de kleur echt?
- is de schermschaal anders dan je dacht?
Die vier vragen lossen vaak al veel op.
Wil je hier logisch op doorgaan? Kijk dan ook naar Wachten tot een proces klaar is met ProcessWaitClose in AutoIt.
Documentatie
Voor de bron of extra uitleg kun je ook terecht op Wachten op een schermkleur met PixelSearch in AutoIt.
Bevers gedachte
PixelSearch
is handig als je scherm niet netjes te sturen is met een vaste wachttijd. Je kijkt dan naar wat er echt op het scherm staat. Dat maakt je script vaak rustiger en slimmer. Kleine tip van de oever: begin klein, zoek een duidelijk kleurpunt, en voeg pas daarna extra stappen toe 🦫