Een klein traymenu maken in AutoIt

AutoIt: ${SelfPath} voor het pad naar je eigen script

Kort probleem

Je hebt een klein hulpprogramma dat altijd snel bereikbaar moet zijn. Niet in een groot venster, maar netjes in het systeemvak bij de klok. Daar klik je op, kies je een actie, en klaar.

Daarvoor gebruik je in AutoIt TrayCreateItem, TrayGetMsg en TraySetState. Zo maak je een tray-menu, lees je de klik uit en zet je het icoon van je script aan.Dat is handig voor een tool die op de achtergrond draait.

Wat wil je oplossen?

Soms wil je script niet de hele tijd een venster tonen. Je wilt wel een paar keuzes geven, zoals “Open”, “Herstart” of “Afsluiten”.Dan is het systeemvak een rustige plek.

De bron van dit probleem is simpel: een klein hulpprogramma makkelijk bereikbaar maken. Je zet het script in de tray en laat het wachten op een klik van de gebruiker. Zo blijft het dicht bij de klok, zonder in de weg te zitten.

De kern van de oplossing

De kern is een klein tray-menu maken en daarna blijven luisteren naar menu-keuzes.

Dat gaat zo:

  • traycreateitem() maakt een item in het tray-menu.
  • TraySetState() zet het tray-icoon zichtbaar.
  • TrayGetMsg() haalt op welke keuze de gebruiker heeft gemaakt.

De flow is dus niet “klik en direct klaar” zoals bij een knop in een venster. Het script draait door en kijkt steeds of er een boodschap uit de tray komt. Als er iets is aangeklikt, pak je dat op en voer je de actie uit.

Event-flow in simpele woorden

De event-flow is de volgorde van gebeurtenissen:

  1. Je script start.
  2. Je maakt tray-items.
  3. Je zet het tray-icoon aan.
  4. Je wacht in een lus.
  5. De gebruiker klikt in het systeemvak.
  6. TrayGetMsg() geeft terug welk item is gekozen.
  7. Jij voert de bijbehorende actie uit.
  8. Bij “Afsluiten” stop je het script.

Dat is het hele idee. Klein, stil en toch goed bereikbaar.

Voorbeeldcode

#include <MsgBoxConstants.au3>

Opt("TrayMenuMode", 3) ; Standaard- en exit-items verbergen

Global $idOpen = TrayCreateItem("Open")
Global $idAbout = TrayCreateItem("Info")
global $idExit = TrayCreateItem("Afsluiten")

TraySetState($TRAY_ICONSTATE_SHOW)

While 1
    switch TrayGetMsg()
        Case $idOpen
            MsgBox($MB_OK, "Tray", "Je koos Open.")
        Case $idAbout
            MsgBox($MB_OK,"Tray","Dit script staat klaar in het systeemvak.")
        Case $idExit
            ExitLoop
    EndSwitch
WEnd

Stap voor stap

Eerst zet je de menu-stand van de tray goed met

Opt("TrayMenuMode", 3)

. Daarmee verberg je het standaardmenu en de standaard exit-keuze. Zo houd je alleen je eigen keuzes over.

Daarna maak je drie items met TrayCreateItem(). Het resultaat daarvan bewaar je in variabelen zoals $idOpen, $idAbout en $idExit. Dat is belangrijk, want je vergelijkt later tegen die waarden.

Daarna zet je het tray-icoon zichtbaar met TraySetState($TRAY_ICONSTATE_SHOW). Zonder dat kan je script wel draaien, maar zie je het pictogram niet goed terug.

Daarna volgt de wachtlus. In die lus roep je steeds TrayGetMsg() aan.Die functie geeft terug welk menu-item is aangeklikt. Daarna gebruik je Switch om te kijken welke keuze het was.

Hoe de code werkt

De code is klein, maar elke regel heeft een taak.

OnderdeelWat doet het?
TrayCreateItem("Open")Maakt een klikbaar menu-item
TrayCreateItem("Info")Maakt nog een menu-item
TrayCreateItem("Afsluiten")Maakt een item om te stoppen
TraySetState($TRAY_ICONSTATE_SHOW)Zorgt dat het tray-icoon zichtbaar is
TrayGetMsg()Leest welke tray-actie is gekozen

De belangrijke gedachte is dit: je ontvangt niet “een klik” zoals bij een gewone knop. Je krijgt een bericht terug uit de tray. Dat bericht check je steeds opnieuw in de lus.

kleine test

Start het script en kijk rechtsonder in de taakbalk. Je moet het tray-icoon zien. Klik erop en kies een item.

  • Kies je Open, dan komt een berichtvenster.
  • Kies je Info, dan krijg je korte uitleg.
  • Kies je Afsluiten, dan stopt de lus en sluit het script netjes.

Dat is een fijne manier om een klein hulpprogramma altijd bij de hand te houden.Niet groot, niet druk, gewoon daar waar je het nodig hebt. 🦫

Veelgemaakte fout

Een veelgemaakte fout is dat mensen wel

TrayCreateItem()

gebruiken,maar vergeten om

TrayGetMsg()

te blijven lezen. Dan ziet het tray-menu er goed uit,maar reageert het script niet op een klik.

Een andere fout is dat de variabelen niet worden bewaard. Dan kun je later niet goed testen welk item is gekozen. Je hebt die waarden nodig om de klik te herkennen.

Nog een punt: als je het tray-icoon niet zichtbaar zet met TraySetState(), lijkt het soms alsof er niets gebeurt. Het script draait misschien wel, maar de gebruiker ziet het niet goed terug.

Handige variant

Als je maar één simpele taak hebt, kun je ook korter werken. Je maakt dan minder items en houdt de lus heel klein. Toch blijft hetzelfde patroon gelden: item maken, staat zetten, bericht lezen.

Global $idExit = TrayCreateItem("Afsluiten")
traysetstate($TRAY_ICONSTATE_SHOW)

While 1
    If TrayGetMsg() = $idExit Then ExitLoop
WEnd

Dit is handig voor een hulpprogramma dat alleen een snelle stop-knop nodig heeft. Minder code, zelfde idee.

Documentatie

Wil je de originele uitleg of documentatie ernaast houden? Kijk dan even op Een klein traymenu maken in AutoIt.

Bevers gedachte

een klein tray-menu is vaak precies goed voor een tool die op de achtergrond draait. Je houdt het rustig voor de gebruiker en toch blijft alles dichtbij.

De slimme stap is niet veel extra code toevoegen. De slimme stap is weten wanneer je een tray-item, een tray-bericht en een zichtbare tray-stand nodig hebt. Dan voelt je script meteen duidelijker en netter aan.

Voor meer details kun je ook de AutoIt-documentatie bekijken bij TrayCreateItem() en de andere tray-functies op de officiële site: https://www.autoitscript.com/autoit3/docs/functions/TrayCreateItem.htm