AutoIt: een venster openen en daarop klikken
MouseClick of MouseMove lijkt soms rare dingen te doen. Je denkt dat je op een knop klikt, maar de muis gaat naar een andere plek. Dat komt vaak niet door de klik zelf, maar door de coordinaten. Met Opt("MouseCoordMode", ...) en Opt("PixelCoordMode", ...) kies je welk punt AutoIt gebruikt.Dan weet je of je kijkt naar het scherm,het venster of het deel van het venster waar je echt kunt klikken.
Kort probleem
Je script werkt misschien op jouw scherm, maar niet op een andere pc.Of de klik lijkt goed, maar raakt toch het verkeerde vlak. Dat voelt alsof AutoIt liegt,maar meestal kijkt het gewoon naar een ander soort plek.
Het lastige is dit: x en y zijn niet altijd gelijk.Ze kunnen slaan op het hele scherm,op een venster,of op het client-gedeelte van dat venster. Het client-gedeelte is het stukje binnen het venster, dus zonder de rand en zonder titelbalk.
Drie soorten plekken
als je met muis of pixels werkt, moet je weten waar de telling start. AutoIt gebruikt daarvoor coordinaten. Dat zijn de nummers die zeggen: ga zoveel naar rechts en zoveel naar beneden.
Hier is het verschil simpel:
- Scherm: het hele beeld van je monitor.
- Venster: het hele raam met rand en titelbalk.
- client: het binnenste deel van het venster waar de inhoud staat.
Kijk hier goed naar, want precies daar gaat het vaak mis. Als je een knop zoekt in een venster, maar je rekent vanaf het scherm, dan kom je op de verkeerde plek uit.
De kern van de oplossing
De bron zegt het heel direct: gebruik Opt met MouseCoordMode en PixelCoordMode. Daarmee zet je de regels voor muis en pixel op dezelfde manier.
Opt is een functie waarmee je een instelling zet. Je geeft de naam van de instelling en de waarde. daarna gebruikt AutoIt die keuze voor de volgende acties.
De twee dingen waar het hier om draait zijn:
mousecoordmodePixelCoordMode
Die twee zorgen ervoor dat muisklikken en pixel-zoeken hetzelfde soort coordinaten gebruiken. Dat maakt je script veel duidelijker. En vooral: minder foutgevoelig.
Wat doen die twee opties?
| Optie | Waar gaat het over? | Waarom nuttig? |
|---|---|---|
MouseCoordMode | Waar AutoIt de muis-plek telt | Voor klikken en bewegen |
PixelCoordMode | Waar AutoIt pixels telt | Voor zoeken naar kleuren of beeldpunten |
Als deze instellingen niet passen bij je script,lijkt alles soms “verschuiven”. Dan klik je wel op
x=100, y=50
, maar dat was gemeten vanaf een ander punt dan je dacht.
Voorbeeldcode
Hier is een simpel voorbeeld. het zet de coordinaten naar de client van het actieve venster. Daarna beweegt het de muis en klikt het op een plek in dat venster.
Opt("MouseCoordMode", 2)
Opt("PixelCoordMode", 2)
<p>winactivate("Kladblok")<br>
MouseClick("left", 100, 50, 1, 0)
Wat gebeurt hier?
Opt("mousecoordmode", 2)zet de muiscoordinaten op het client-gedeelte van het actieve venster.Opt("PixelCoordMode", 2)doet hetzelfde voor pixel-zoekwerk.WinActivate("Kladblok")zet het venster op de voorgrond.MouseClick("left", 100, 50, 1, 0)klikt links opx=100,y=50.
De exacte betekenis van de getallen hangt af van de gekozen coordmodus. Daarom is die eerste stap zo belangrijk. Zonder dat kun je makkelijk naast de knop klikken.
Stap voor stap
Eerst kies je hoe je wilt meten.Vraag jezelf af: wil ik tellen vanaf het scherm, vanaf het hele venster, of vanaf het binnenste deel?
Daarna zet je de optie met Opt.Als je wilt werken binnen een venster, kies je een coordmodus die daarbij past. Zo blijft je script logisch: jij denkt in vensters, en AutoIt ook.
Daarna activeer je het juiste venster. Dat is slim, want anders kan de klik op een ander venster landen. Zeker als er meerdere vensters open staan, is dat snel mis.
Daarna gebruik je MouseClick, MouseMove of een pixelfunctie. Als al die dingen dezelfde coordinaten gebruiken, wordt het gedrag veel voorspelbaarder.
Simpele uitleg van de drie begrippen
- Scherm: alles wat je ziet op de monitor.
- Venster: het hele programma in één blok.
- Client: alleen het deel waar inhoud en knoppen staan.
Dat kleine verschil maakt veel uit. een titelbalk en rand tellen wel mee bij een venster,maar niet bij de client. Dus een klik op 10,10 kan in het ene geval de rand raken en in het andere geval gewoon een knop.
Kleine test
Wil je snel zien waar het misgaat? Test dan met een bekende plek. Kies een venster dat je goed kent, zoals een simpel tekstvenster, en klik op een plek die je goed kunt zien.
probeer dan twee keren:
- één keer met de verkeerde coordmodus
- één keer met de juiste coordmodus
Zo zie je direct het verschil. Vaak valt dan ineens op dat het probleem niet in de klik zit,maar in het startpunt van de telling.
Als je ook met kleuren werkt, doe dan hetzelfde voor PixelCoordMode. Anders zoek je een kleur op de ene plek en klik je op een andere. Dat geeft rare fouten die lastig te zien zijn.
Veelgemaakte fout
De meest gemaakte fout is: denken dat alle coordinaten altijd vanaf het scherm lopen. Dat is niet zo. AutoIt kan op meer dan één manier tellen, en dat moet je zelf goed zetten.
Nog een fout: een venster niet eerst actief maken. Dan kan de klik wel met goede coordinaten werken, maar toch op een ander venster landen. dat voelt alsof de coordinaten fout zijn, terwijl het echte probleem de focus is.
Een derde fout: vergeten dat het client-gedeelte kleiner is dan het hele venster. Dan klopt je rekensom net niet. Vooral bij vensters met een dikke rand of een titelbalk zie je dat snel.
Handige variant
Soms wil je eerst weten wat je nodig hebt voor de taak, en pas daarna de klik doen. Dan is een kleine vaste start handig. Je zet dan eerst de coordmodus, activeert het venster en doet daarna pas je muis- of pixelactie.
Opt("mousecoordmode", 1)
Opt("PixelCoordMode", 1)
WinActivate("Kladblok")
MouseMove(200, 120, 0)
Hier zorgt 1 voor een andere manier van tellen dan in het vorige voorbeeld. Dat laat goed zien waarom je de bron moet volgen en niet zomaar moet gokken. De keuze van de coordmodus bepaalt namelijk hoe AutoIt de getallen leest.
Bevers gedachte
De truc is klein, maar nuttig: kies eerst je meetpunt, dan pas je klik. Als de coordinaten raar lijken, is de kans groot dat je vanaf de verkeerde plek telt. Met Opt("MouseCoordMode", ...) en Opt("PixelCoordMode", ...) haal je dat soort foutjes weg.
Dus: denk in scherm, venster of client. Zet de juiste optie.En klik dan pas. Dat scheelt je een hoop gepruts, en je beverhart blijft rustig 🦫