Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Inspecteer en communiceer met het uitvoeren van Windows toepassingen vanaf de opdrachtregel. Wordt gebruikt door AI-agents en ontwikkelaars voor het testen van gebruikersinterfaces, foutopsporing en automatisering.
Overzicht
winapp ui biedt opdrachten voor het controleren en gebruiken van Windows app-API's.
Maakt gebruik van Windows UI Automation (UIA). Werkt met elke Windows-app: WPF, WinForms, Win32, Electron en WinUI 3.
De meeste opdrachten sturen de app via UIA-patronen (geen invoerinjectie). De uitzonderingen injecteren echte invoer: ui click/ui hoverui drag/gebruik muissimulatie,/ui touchui pen synthetiseer aanraak- en pen-/stylusinvoer en ui send-keys synthetiseert toetsenbordinvoer voor besturingselementen en scenario's die UIA-patronen niet kunnen besturen.
Important
Interactieve bureaubladvereiste (invoerinjecterende werkwoorden).click, hover, , touchdragpen, , scroll --wheelen send-keys --via send-input synthetiseer invoer op besturingssysteemniveau, zodat ze een ontgrendeld, interactief bureaublad nodig hebben met het doelvenster op de voorgrond. Op een vergrendeld werkstation of beveiligd bureaublad (LogonUI/UAC) kunnen ze niet snel injecteren en mislukken met no_interactive_desktop (los van de benodigde/foreground_not_target gevallen).
touch
/
pen weiger bovendien wanneer er geen venster wordt omgezet (no_target); een coördinaat buiten het doelvenster is een niet-fatale waarschuwing (een warnings[] vermelding onder --jsonof een waarschuwingsregel in de tekstmodus) en injectie gaat nog steeds verder , consistent met de muiswoorden. Al het andere : inspect, search, get-property, get-value, wait-for, set-value, invoke, , scroll --direction/--toscreenshot - stuurt de app door middel van UIA-patronen en is headless/locked-session vriendelijk. Geef de voorkeur aan de UIA-patroonwoorden in CI; reserveer de injectiewoorden voor scenario's die echt echte invoer nodig hebben. Voordat u het injecteert, lossen de gebaarwoorden ook het doelelement opnieuw op en weigeren ze met target_moved als het nog steeds animatie/verplaatsen is, in plaats van invoer te landen op lege ruimte.
Snel aan de slag
# Connect to any app and see its UI tree
winapp ui inspect -a notepad
# Find specific elements
winapp ui search Button -a notepad
# Activate an element
winapp ui invoke Close -a notepad
# Take a screenshot
winapp ui screenshot -a notepad
Apps instellen
Op procesnaam
winapp ui inspect -a notepad
winapp ui inspect -a slack # auto-picks visible window for multi-process apps
winapp ui inspect -a imageresizer # partial match: finds PowerToys.ImageResizer
Op venstertitel
winapp ui inspect -a "LICENSE - Notepad"
winapp ui inspect -a "Fix WinApp" # partial title match
Per PID
winapp ui inspect -a 12345
Door HWND (stabiel — overleeft tab-/titelwijzigingen)
# Discover HWNDs
winapp ui list-windows -a Terminal
→ HWND 985238: "🤖 Testing" (WindowsTerminal, PID 21228)
→ HWND 131906: "Fix WinApp" (WindowsTerminal, PID 21228)
# Target specific window
winapp ui inspect -w 131906
winapp ui screenshot -w 131906
Gebruiken -a voor detectie, -w voor stabiele targeting. Wanneer -a deze overeenkomen met meerdere vensters, worden deze weergegeven met HWND's die u kunt kiezen.
Selectoren
Doelelementen met behulp van de selector die wordt weergegeven in [brackets] inspect/search-uitvoer.
Er zijn drie typen selectors:
| Selector | Meaning | Example |
|---|---|---|
MinimizeButton |
AutomationId (weergegeven als uniek — stabiel, voorkeur) | winapp ui invoke MinimizeButton -a myapp |
btn-close-d1a0 |
Semantische slug (weergegeven wanneer geen unieke AutomationId) | winapp ui invoke btn-close-d1a0 -a myapp |
Submit |
Zoeken in tekst zonder opmaak op naam/AutomationId (hoofdlettergevoelige subtekenreeks) | winapp ui invoke Submit -a myapp |
AutomationId-selectors zijn id's voor ontwikkelaarssets (AutomationProperties.AutomationId in XAML).
Wanneer een AutomationId uniek is in de hele UI-structuur inspect en search deze rechtstreeks als de selector weergeeft, blijven de indelingswijzigingen, lokalisatie en structuurherstructurering behouden.
Slugselectors (bijvoorbeeld btn-close-d1a0) worden gegenereerd wanneer er geen unieke AutomationId bestaat.
Indeling: prefix-name-hash. De hash valideert de elementidentiteit, maar kan verlopen nadat de gebruikersinterface is gewijzigd.
Uitvoerindeling controleren
De inspect opdracht toont de elementstructuur met gekleurde uitvoer (selector in cyaan, naam in groen, metagegevens in grijs):
TabView Tab (0,-1 1200x48)
TabListView List (4,-1 1100x48)
tab-newtab-5f5b TabItem "New Tab" (14,-1 200x48)
NewTabButton SplitButton "New Tab" [collapsed] (1104,5 96x36)
Found 10 elements (--depth 3). Use the first token as selector, e.g.: winapp ui invoke TabView -a terminal
Het eerste woord op elke regel is de selector. Gebruik het met andere ui opdrachten.
Wanneer een element een unieke AutomationId heeft, wordt het rechtstreeks gebruikt (bijvoorbeeld TabView, NewTabButton).
Wanneer er geen unieke AutomationId bestaat, wordt er een gegenereerde slug gebruikt (bijvoorbeeld tab-newtab-5f5b).
Semantische slugs
Slugs gebruiken de notatie: prefix-normalizedname-hash waarbij:
- voorvoegsel — afkorting van 3 letters (btn, txt, chk, cmb, itm, tab, img, lbl, pn, win, grp, lnk, mnu, enz.)
- normalizedname : alfanumerieke kleine letters van AutomationId (voorkeur) of Naam, maximaal 15 tekens
- hash : hexhash van 4 tekens van de RuntimeId van het element (valideert elementidentiteit)
Slugs zijn shell-safe (geen speciale tekens), uniek en kunnen rechtstreeks als argumenten worden gebruikt. De hash biedt verouderingsdetectie. Als het element is vervangen, krijgt u het volgende: 'Element is mogelijk gewijzigd. Voer de inspectie opnieuw uit."
Elementen zonder naam of AutomationId geven alleen voorvoegsel en hash weer (bijvoorbeeld pn-c8a3).
Meerdere overeenkomsten ondubbelzinnig maken
Slugs van inspect/search uitvoer zijn uniek, maar kunnen worden gewijzigd in indelingswijzigingen. Gebruik ze boven namen of tekst zonder opmaak wanneer meerdere overeenkomsten overeenkomen. Wanneer een selector dubbelzinnig is, worden alle overeenkomsten met hun slugs afgedrukt, zodat u de juiste kunt kiezen en opnieuw kunt uitvoeren met die slug.
winapp ui search Button -a myapp # shows: btn-ok-a1b2 "OK", btn-cancel-c3d4 "Cancel"
winapp ui invoke btn-ok-a1b2 -a myapp # invoke using slug (preferred)
winapp ui invoke btn-cancel-c3d4 -a myapp # invoke the other Button by its slug
Zoeken in tekst zonder opmaak
Gebruik tekst zonder opmaak om te zoeken naar elementen. Er is geen speciale syntaxis nodig:
winapp ui search Minimize -a notepad # finds elements with "Minimize" in Name or AutomationId
winapp ui search Close -a notepad # case-insensitive substring match
winapp ui invoke Minimize -a notepad # search + invoke in one step (disambiguates if needed)
winapp ui search "Save" -a notepad # find elements containing "Save"
winapp ui search "error" -a myapp # case-insensitive match
Wanneer een tekstzoekopdracht overeenkomt met meerdere elementen (bijvoorbeeld SettingsExpander waarbij groep, knop en tekst allemaal dezelfde naam delen), kiest de CLI automatisch het enige aanroepbare element. Als er meerdere aanroepbaar zijn, worden alle overeenkomsten met slugs weergegeven.
Voor niet-aanroepbare zoekresultaten (bijvoorbeeld een TextBlock binnen een knop), wordt automatisch de dichtstbijzijnde aanroepbare bovenliggende bovenliggende waarde weergegeven, het bovenliggende element waarmee invokeu kunt gebruiken.
Dit werkt voor alle zoekkiezers:
lbl-savechanges-a1b2 "Save changes" (120,40 80x20)
^ invoke via: btn-save-c3d4 "Save"
De surfaced selector kan rechtstreeks worden gebruikt:
winapp ui invoke btn-save-c3d4 -a myapp # invoke the parent Button
Opdrachten
status
Maak verbinding met een app en geef verbindingsgegevens weer.
winapp ui status -a notepad
winapp ui status -a notepad --json
Inspecteren
Bekijk de structuur van het ui-element. De uitvoer toont semantische slugs met twee spaties inspringing voor de hiërarchie:
winapp ui inspect -a notepad # full window tree, depth 3
winapp ui inspect -a notepad --depth 5 # deeper tree
winapp ui inspect txt-searchbox-e5f6 -a notepad # subtree rooted at element
winapp ui inspect --ancestors btn-close-d1a2 -a notepad # walk up from element to root
winapp ui inspect -a myapp --interactive # invokable elements only, auto-depth 8
winapp ui inspect -a myapp --hide-disabled # hide disabled elements
winapp ui inspect -a myapp --hide-offscreen # hide offscreen elements
Voorbeelduitvoer (standaard):
win-aidevgalleryp-f1a3 "AI Dev Gallery Preview" (94,206 1280x1023)
pn-c8a3 (102,207 1264x1014)
btn-minimize-d1a0 "Minimize" (1222,206 48x48)
btn-maximize-e2b1 "Maximize" (1270,206 48x48)
itm-samples-3f2c "Samples" (102,330 72x62)
Voorbeelduitvoer (--interactive — alleen aanroepbare elementen, platte lijst):
btn-minimize-d1a0 "Minimize" (1222,206 48x48)
btn-maximize-e2b1 "Maximize" (1270,206 48x48)
btn-close-d1a2 "Close" (1318,206 48x48)
itm-home-7b3e "Home" (102,268 72x62)
itm-samples-3f2c "Samples" (102,330 72x62)
itm-models-9a4f "Models" (102,392 72x62)
Elementen kunnen deze statusmarkeringen weergeven:
-
[on]/[off]/[indeterminate]— status van wisselknop/selectievakje -
[collapsed]/[expanded]— de status voor bomen, keuzelijsten met invoervak, menu-items uitvouwen/samenvouwen -
[scroll:v]/[scroll:h]/[scroll:vh]— schuifbare container (verticaal, horizontaal of beide) -
[offscreen]— element is niet zichtbaar op het scherm -
[disabled]— element is niet ingeschakeld -
value="..."— huidige tekstinhoud voor bewerkbare elementen (indien anders dan Naam)
search
Zoek elementen die overeenkomen met een selector. Uitvoer toont semantische slugs:
winapp ui search Button -a notepad # all buttons
winapp ui search Close -a notepad # finds elements with "Close" in name
winapp ui search SearchBox -a notepad # finds elements with "SearchBox" in name or AutomationId
winapp ui search Button --max 10 -a notepad # limit results
Voorbeelduitvoer:
btn-minimize-d1a0 "Minimize" (1222,206 48x48)
btn-maximize-e2b1 "Maximize" (1270,206 48x48)
btn-close-d1a2 "Close" (1318,206 48x48)
Slugs die worden weergegeven in de uitvoer (bijvoorbeeld btn-minimize-d1a0) kunnen rechtstreeks worden gebruikt met andere opdrachten:
winapp ui invoke btn-minimize-d1a0 -a notepad
get-property
Eigenschapswaarden van een element lezen. Bevat patroonspecifieke status (ToggleState, Waarde, IsSelected, enzovoort).
winapp ui get-property btn-submit-7a90 -a myapp # all properties
winapp ui get-property chk-checkbox-b2c3 -p ToggleState -a myapp # checkbox state
winapp ui get-property txt-textbox-a4b1 -p Value -a myapp # current text value
winapp ui get-property cmb-combobox-d5e6 -p ExpandCollapseState -a myapp # expanded or collapsed
schermopname
Een venster of element vastleggen als PNG. Wanneer er meerdere vensters bestaan (bijvoorbeeld app en dialoogvenster openen), worden ze samengevoegd in één PNG-bestand met elk venster dat is gestikt.
winapp ui screenshot -a notepad # saves screenshot.png in cwd
winapp ui screenshot -a notepad --output my.png # custom filename
winapp ui screenshot -a notepad --json # returns file path as JSON
winapp ui screenshot -w 131906 # target specific HWND (+ its dialogs)
winapp ui screenshot txt-searchbox-e5f6 -a myapp # crop to element bounds
winapp ui screenshot -a myapp --capture-screen # capture from screen (includes popups/overlays; foregrounds window)
winapp ui screenshot -a myapp --focus # bring window to foreground first, then capture (default WGC path)
Wanneer dialoogvensters of pop-ups zijn geopend, worden alle vensters samengevoegd in één PNG,zodat u de volledige UI-status in één afbeelding kunt zien.
Het standaardpad voor vastleggen maakt gebruik van Windows. Graphics.Capture (WGC), het lezen van het werkelijke DWM-samengestelde oppervlak, met behoud van afgeronde hoeken, transparantie en werken zelfs terwijl het venster wordt ondergesloten door andere windows. Als WGC niet beschikbaar is (oudere Windows builds) valt de CLI terug naar PrintWindow.
Gebruik --capture-screen deze optie wanneer u pop-upmenu's, vervolgkeuzelijsten, flyouts of knopinfo-overlays wilt vastleggen die niet eigendom zijn van het doelvenster.
--capture-screen leest van het scherm DC en brengt het venster eerst op de voorgrond. Gebruik --focus deze optie als u alleen het venster wilt voorgronden zonder over te schakelen tussen opnamemodi (bijvoorbeeld om ervoor te zorgen dat de schermopname overeenkomt met wat de gebruiker momenteel bekijkt).
verslag / opname
Noteer het doelvenster (of de regio van een element) naar een H.264 MP4-video. Frames worden vastgelegd via Windows Graphics Capture (met PrintWindow/screen-DC fallback) en gecodeerd incrementeel met Media Foundation, zodat opnamen nooit de volledige video in het geheugen bufferen.
Standaardgedrag (--duration-sec 0): records totdat ze zijn gestopt. Gebruik Ctrl+C interactief of (voor programmatische/agentoproepers) schrijf een nieuwe regel naar stdin of sluit stdin om de MP4 correct te stoppen en te voltooien. Een geldige, afspeelbare MP4 wordt altijd voltooid op elke sierlijke stop, geen beschadiging.
# Timed: record for 10 s at 15 fps
winapp ui record -a myapp --duration-sec 10 --fps 15 --output demo.mp4
# Unbounded (default): record until Ctrl+C, downscaled to max 1280px longest edge
winapp ui record -a myapp --max-edge 1280 --output capture.mp4
# Programmatic stop (agent/script): pipe a newline; the recorder stops and writes a valid MP4
"" | winapp ui record -a myapp --json --output capture.mp4
# Record a single element's region (fails with element_not_found if the selector doesn't match)
winapp ui record itm-chart-9f8e -a myapp --output chart.mp4
# Include screen overlays / popups (captures from screen DC; brings window to foreground)
winapp ui record -a myapp --capture-screen --duration-sec 5 --output with-popups.mp4
Opties:
-
--duration-sec N— Record voor N seconden. Standaard 0 = record totdat deze is gestopt. -
--fps N— Doelframes per seconde (standaard 15). -
--max-edge N— Omlaag schalen zodat de langste rand maximaal N pixels is (0 = geen downscale). -
--capture-screen— Vastleggen vanaf het scherm DC (inclusief overlays/pop-ups; voorgrond van het venster). -
--output <path>— MP4-uitvoerpad. De standaardinstelling isrecording-<timestamp>-<guid>.mp4in de huidige map.
Stopmechanismen:
- Interactief: Ctrl+C (elk platform).
- Programmatisch/agent: schrijf een nieuwe regel (
"") of sluit stdin (EOF). De stop wordt toegepast zodra de encoder gereed is (eerste frame vastgelegd); elk stopsignaal dat aankomt voordat het eerste frame wordt vastgelopen en onmiddellijk wordt toegepast - er is geen respijtvenster en geen wandklokvertraging.
Opnamemodi (gerapporteerd in het JSON-veld mode ):
-
wgc— Windows Graphics Capture (standaard; werkt terwijl het venster is afgesloten). -
printwindow— GDI PrintWindow (terugval wanneer WGC niet beschikbaar is op dit systeem/sessie; voer opnieuw uit met--capture-screenschermDOMEINCONTROLLER in plaats daarvan). -
screen— Scherm DC via--capture-screen(inclusief overlays/pop-ups; brengt het venster naar de voorgrond).
JSON-uitvoer (--json):
-
stdout (eindresultaat):
{ "path", "frames", "width", "height", "fileSize", "codec": "h264", "mode", "fps", "durationSec" } -
stderr (livenessgebeurtenis, verzonden wanneer het vastleggen begint):
{ "event": "recording-started", "path", "fps", "durationSec" }
Met de livenessgebeurtenis op stderr kunnen programmatische bellers weten dat de capture-lus live is zonder te wachten op het uiteindelijke resultaat. Het uiteindelijke resultaat van JSON op stdout is één schoon object.
Foutcodes:
-
element_not_found— Selector gegeven, maar geen overeenkomend element gevonden; mislukt onmiddellijk (geen gedeeltelijk bestand geschreven). -
ambiguous_selector— Een selector voor tekst zonder opmaak komt overeen met meerdere elementen; gebruik een slak uit de suggesties die worden weergegeven in de fout (of vaninspectuitvoer) om een specifiek element te bereiken. -
invalid_arguments— Ongeldige optiewaarde (bijvoorbeeld--duration-sec -1of> 86400).
Bekende beperking: pop-ups met vensters: Wanneer u een specifiek element (per selector) opneemt dat zich in een pop-up bevindt die in een eigen venster op het hoogste niveau wordt weergegeven, zoals een WinUI/XAML-flyout, onderwijstip, knopinfo of menu (Xaml_WindowedPopupClass) - kan de recorder het onderliggende hoofdvenster vastleggen in plaats van de pop-up, waardoor lege of verlopen frames worden geproduceerd. Noteer het hele venster (laat de selector weg) of gebruik winapp ui screenshot --capture-screen deze voor pop-up stills. Bijgehouden in #646.
Programmatisch een element activeren (klik op de knop, schakeloptie in, keuzelijst met invoervak uitvouwen).
winapp ui invoke btn-submit-7a90 -a myapp # by slug from inspect
winapp ui invoke btn-submit-a1b2 -a myapp # by slug from inspect/search
winapp ui invoke cmb-sizecombobox-b4c5 -a myapp # expand combo box
Probeert patronen in volgorde: InvokePattern → TogglePattern → SelectionItemPattern → ExpandCollapsePattern.
click
Klik op een element op de schermcoördinaten met behulp van muissimulatie. Gebruik dit voor besturingselementen die geen ondersteuning bieden InvokePattern (bijvoorbeeld kolomkoppen, lijstitems).
winapp ui click btn-column1-a3f2 -a myapp # single click by slug
winapp ui click "Column1" -a myapp # single click by text search
winapp ui click btn-column1-a3f2 -a myapp --double # double-click
winapp ui click btn-column1-a3f2 -a myapp --right # right-click
Net als de andere invoerinjecterende werkwoorden,
clickbrengt u het doel naar de voorgrond en mislukt u snel (no_interactive_desktopop een vergrendeld/beveiligd bureaublad,foreground_not_targetals de focus niet kan worden overgedragen) in plaats van op het verkeerde venster te klikken. Het element wordt ook opnieuw omgezet vlak voor de knop omlaag: na het plaatsen van de cursor wordt er één laatste positiecontrole uitgevoerd, zodat een continu bewegend/animatief doel mislukt mettarget_movedin plaats van het rapporteren van succes nadat de klik op lege ruimte is terechtgekomen. Een gerapporteerd succes betekent dat het doel nog steeds aanwezig was toen de knop omlaag ging.
Drag
Druk op het ene punt op de muisknop, ga naar het andere en laat vervolgens los met drag <from> <to>, waarbij elk eindpunt een elementselector is (sleept van/naar het midden van het element) of schermcoördinaten x,y precies zoals gerapporteerd door winapp ui inspect. Mix en match vrij (selector→selector, selector→coords, coords→coords).
Wordt SendInput gebruikt met tussenliggende verplaatsingen, zodat de app een realistische stroom berichten WM_MOUSEMOVE ziet. Gebruik deze optie voor het opnieuw ordenen/wijzigen van formaatgrepen, schuifregelaars, tekenpapier en slepen en neerzetten.
winapp ui drag itm-card-9f8e itm-slot-2c1a -a myapp # reorder: card center → slot center
winapp ui drag itm-card-9f8e 300,400 -a myapp # element center → screen coords (from inspect)
winapp ui drag 120,200 480,200 -a myapp # raw screen coords → screen coords
winapp ui drag itm-card-9f8e itm-trash-0001 -a myapp --right # right-button drag
# Press-and-hold / long-press and drop-target dwell
winapp ui drag tile-photo-7b3c tile-photo-7b3c -a myapp --hold-ms 600 # long-press: from == to, hold 600ms, no move
winapp ui drag itm-card-9f8e pane-left-2c1a -a myapp --dwell-ms 350 # settle on the drop target before releasing
Opties:
-
--right— Sleep met de rechtermuisknop in plaats van de linkerknop. -
--hold-ms <ms>— Houd de knop aan het begin ingedrukt voordat u gaat bewegen (standaard: 0). Met<from> == <to>(geen beweging) voert dit een druk-en-hold / long-press beweging uit. -
--dwell-ms <ms>— Dwell op de bestemming na verplaatsing, voordat deze wordt vrijgegeven (standaard: 0). Hiermee kunt u doelen verwijderen/overlays samenvoegen die arm van een aanhoudende muisaanwijzer (in plaats van het moment waarop de cursor binnenkomt) vergrendelen voordat de knop omhoog gaat.
Bare
x,yzijn schermcoördinaten in hetzelfde ruimterapportwinapp ui inspect/searchen een selector wordt omgezet in het midden van het element. Inspecteer eerst om punten te kiezen.
Net zoals
send-keys --via send-input,draginjecteert os-brede op schermcoördinaten na het brengen van het doel op de voorgrond. Als de focus niet naar het doel kan worden gebracht (b.v. focus-steeling preventie van een achtergrondproces), mislukt de opdracht (foreground_not_target) in plaats van te slepen op het verkeerde venster: focus of klik eerst op het venster. Op een vergrendeld/beveiligd bureaublad mislukt het metno_interactive_desktop. Elk elementeindpunt wordt onmiddellijk vóór de sleep opnieuw omgezet; als de opdracht nog steeds wordt verplaatst/verkleind (een animatiedoel), mislukt de opdracht intarget_movedplaats van naar een verlopen punt te slepen. (Legex,yeindpunten kunnen niet opnieuw worden geverifieerd, zodat ze worden gebruikt as-is.)
Aanraken
Injecteer synthetische aanraakbewegingen met behulp van de Windows aanwijzer-injectie-API. Het anker voor contactpersonen is een elementkiezer (gebruikt het midden van het element) of een expliciet schermcoördinaat x,y via --at (dezelfde ruimterapporten winapp ui inspect ). Gebruik deze functie voor tikken/drukken op interacties en bewegingen met meerdere aanraakbewegingen die de muissimulatie niet kan uitdrukken.
winapp ui touch btn-ok-1a2b -a myapp # tap at the element center
winapp ui touch -a myapp --at 320,240 # tap at explicit screen coords
winapp ui touch tile-photo-7b3c -a myapp --gesture long-press --hold-ms 600
winapp ui touch -a myapp --at 100,300 --gesture swipe --to-point 400,300
winapp ui touch img-map-9f8e -a myapp --gesture pinch --distance 200 # pinch-to-zoom out (2 fingers)
winapp ui touch img-map-9f8e -a myapp --gesture stretch --distance 200 # stretch-to-zoom in (2 fingers)
Opties:
-
--gesture <g>—tap(standaard),double-tap,long-press,swipe, ,pinch.stretch -
--at <x,y>— Expliciet beginpunt (schermcoördinaten). De standaardinstelling is het elementcentrum van de selector. -
--to-point <x,y>— Eindpunt voor eenswipe. Heeft voorrang op--direction. -
--direction <right|left|up|down>— Veegrichting (standaard:right). Gecombineerd met--distancehet berekenen van het eindpunt wanneer--to-pointdit niet is opgegeven. -
--distance <px>— Vinger verspreid voorpinch/stretchof veeg afstand in pixels. -
--hold-ms <ms>— Houd contactpersonen ingedrukt voordat u opheft (houd de tijd lang ingedrukt; de standaardwaarde is 500 ms voorlong-presswanneer deze niet is ingesteld). -
--duration-ms <ms>— Glide tijd voor bewegende bewegingen (veeg/knijp/stretch; standaard 300). -
--fingers <n>— Aantal contactpersonen (1-10; standaard 1).pinch/stretchgebruik altijd 2.
Injectieveiligheid.
touchweigert te injecteren tenzij een niet-nul doelvenstergreep wordt omgezet en dat venster de voorgrond bevat. Het mislukt wanneerno_targeter geen venster kan worden omgezet,foreground_not_targetals de focus niet kan worden overgedragen ofno_interactive_desktopop een vergrendeld/beveiligd bureaublad. Elke coördinaat (elementcentrum, expliciet--at/--to-pointen gegenereerde waypoints) wordt gecontroleerd op de rechthoek van het doelvenster; een punt buiten het venster wordt weergegeven als een niet-fatale waarschuwing (eenwarnings[]vermelding in--json, of een waarschuwingslijn in de tekstmodus) en de injectie gaat nog steeds verder , die overeenkomt met de muiswoorden (drag/scrollclick/hover/), die ook in out-of-window-coördinaten injecteert.--fingersboven de 10 wordt vooraf geweigerd.Hardwarenotitie. Touch geeft de voorkeur aan het moderne synthetische aanwijzerapparaat (
CreateSyntheticPointerDevice(PT_TOUCH)) en valt terug op de verouderdeInitializeTouchInjection/InjectTouchInputAPI. Als injectie niet wordt ondersteund op het huidige apparaat/de huidige sessie, wordt met de opdracht de daadwerkelijke Win32-foutcode (bijvoorbeeld 'niet-ondersteund') weergegeven in plaats van een foutief succes te melden. Behandel een niet-nul-uitgang als 'touch not delivered'.Extern bureaublad/VM-sessies. In een Extern bureaublad (RDP) of sommige VM-sessies kan het besturingssysteem synthetische aanraking (exit 0) accepteren zonder dat het daadwerkelijk de doel-app bereikt. Wanneer een externe sessie wordt gedetecteerd,
touchvoegt u een waarschuwing over leveringsonzekerheid toe, eenwarnings[]vermelding in--jsonof een waarschuwingsregel in de tekstmodus. Een ✅/exit 0 betekent dan dat de injectie-aanroep is geslaagd, niet dat de app de invoer heeft ontvangen; bevestig het effect metui screenshot/ui inspectwanneer het belangrijk is.
pen
Injecteer synthetische pen-/stylusinvoer — tikken en pennenstreken — met behulp van de Windows synthetische aanwijzer-API (CreateSyntheticPointerDevice(PT_PEN); Windows 10 1809+). Richt u op een elementcentrum, een expliciet --at punt of een volledige --path pennenstreek.
winapp ui pen canvas-1a2b -a myapp # pen tap at the element center
winapp ui pen -a myapp --at 320,240 --pressure 0.8 # firm pen tap at explicit coords
winapp ui pen -a myapp --path "100,100 150,120 210,140 260,120" # draw an ink stroke
winapp ui pen -a myapp --path "100,100 260,100" --eraser # erase along a stroke
winapp ui pen -a myapp --at 200,200 --tilt-x 30 --tilt-y -15 # tilted pen contact
Opties:
-
--at <x,y>— Pencontactpunt (schermcoördinaten). De standaardinstelling is het elementcentrum van de selector. Genegeerd wanneer--pathwordt gegeven. -
--path "<x,y x,y …>"— Pennenstrekenpad als spaties gescheidenx,yparen (een pad met één punt is een tik). -
--pressure <0.0–1.0>— Pendruk (standaard 0,5). -
--tilt-x <deg>/--tilt-y <deg>— Kantelhoeken van pen, −90 tot 90 (standaard 0). -
--eraser— Gebruik het gumeinde van de pen in plaats van de tip. -
--duration-ms <ms>— Totale reistijd voor pennenstreken in milliseconden verdeeld als geïnterpoleerde UPDATE-frames over het pad (standaard: ~10 ms per waypoint). Gebruik deze optie om te bepalen hoe snel de pen zichtbaar van begin tot eind beweegt.
Injectieveiligheid. Zoals
touch,penweigert te injecteren zonder een niet-nul, voorgronds doelvenster (no_target/no_interactive_desktopforeground_not_target/ ) en controleert elk inktpunt tegen de rechthoek van het doelvenster, waarbij een out-of-window coördinaat wordt weergegeven als een niet-fatale waarschuwing (warnings[]in--json, of een waarschuwingsregel in de tekstmodus) terwijl er nog steeds wordt geïnjecteerd , consistent met de muiswoorden. Ongeldig--pressure(buiten 0,0–1.0) of kantelen (buiten ±90°) worden vooraan geweigerd.Extern bureaublad/VM-sessies. Penroutering is vooral onbetrouwbaar ten opzichte van Extern bureaublad: de injectieaanroep kan slagen (exit 0) melden terwijl er geen peninvoer de app bereikt. Wanneer een externe sessie wordt gedetecteerd,
penvoegt u een waarschuwing over bezorgingsonzekerheid (warnings[]in--jsonof een waarschuwingsregel in de tekstmodus) toe, zodat een ✅ waarschuwing niet wordt verward met bevestigde bezorging. Valideer penafhankelijke stromen op een lokaal, interactief bureaublad.
aanwijzen
Verplaats de muis naar het midden van een element om aanwijseffecten te activeren (knopinfo, flyouts, visuele statussen). Gebruikt SendInput voor realistische muisbewegingen met een kleine pruik en wacht vervolgens op een configureerbare woningtijd.
winapp ui hover btn-info-a1b2 -a myapp # hover with default 800ms dwell
winapp ui hover btn-info-a1b2 -a myapp --dwell-time 1200 # longer dwell for slow tooltips
winapp ui hover btn-info-a1b2 -a myapp; winapp ui screenshot -a myapp --capture-screen # hover then capture tooltip
Opties:
-
--dwell-time <ms>— Tijd in milliseconden om te wachten na het aanwijzen van effecten (standaard: 800, bereik: 0-10000)
send-keys
Synthetische toetsenbordinvoer verzenden - de tegenhanger van het toetsenbord naar click. UIA heeft geen toetsenbordinjectiepatroon, dus dit zakt naar de Win32-laag. Gebruik dit voor toetsenbordnavigatie (pijlen, Tab, Enter, Esc), sneltoetsen (ctrl+c, alt+f4) en typen in besturingselementen die per toetsaanslagen gebeurtenissen nodig hebben in plaats set-valuevan atomische schrijfbewerkingen.
winapp ui send-keys "down down enter" -a myapp # arrow navigation then commit
winapp ui send-keys "ctrl+a delete" -a myapp # select all, then delete
winapp ui send-keys "Hello world" --target txt-name-a1b2 -a myapp # focus a field, then type text
winapp ui send-keys "text=down text=down text=enter" -a myapp # type the words, don't press the keys
winapp ui send-keys "down down enter" -a myapp --verbatim # same, but type the whole argument literally
winapp ui send-keys "alt+f4" -a myapp # close window via accelerator
winapp ui send-keys "vk=0x5D" -a myapp # a key with no friendly name (Apps/Menu key)
winapp ui send-keys "ctrl+shift+t" -a myapp --via send-input # use OS-wide injection instead of PostMessage
winapp ui send-keys "win+shift+v" -a myapp --via send-input --allow-system-keys # opt in to drive a global hotkey
Sleutel grammatica (witruimte-gescheiden tokens, aanhalingstekens met meerdere tokentekenreeksen):
-
Benoemde sleutels : ,
escreturn/spacetab/enterescape,deletedelinsertendbackspace/home,pageup/pgup,uppgdn//down//leftf1rightpagedown, –appsf16, .capslockprintscreen -
Reeksen : meerdere tokens worden op volgorde ingedrukt:
down down enter. -
Modifier combos — ,
ctrl,shift,winaltsamengevoegd met+:ctrl+shift+t, .alt+f4 -
Letterlijke tekst : een token dat geen bekende sleutel is, wordt per teken getypt:
hello. Aangrenzende letterlijke woorden houden de spatie ertussen, zodat een woordgroep tussen aanhalingstekens zoals"Hello world"woordgroepen wordt getypt (de spatie blijft behouden); een letterlijke waarde die alleen tekst bevat+C++ofa+bals tekst is getypt, niet geparseerd als een combinatie. -
Expliciete letterlijke escape - het voorvoegsel van een token om
text=deze letterlijk te typen, zelfs wanneer het conflicteert met een sleutel- of wijzigingsnaam:text=entertypt het woord 'enter' in plaats van op Enter te drukken entext=ctrl+atypt de letterlijke tekenreeks. Hiermee wordt devk=escape gespiegeld; de escape-waarde wordt nog steeds samengevoegd met aangrenzende letterlijke woorden (text=down low→ 'laag omlaag'). Omdat tokens spaties splitsen (en aangrenzende letterlijke waarden opnieuw samenvoegen met één spatie), gebruikt u backslash-escapes in eentext=waarde om witruimte te typen die anders niet zou overleven:\s→ spatie,\t→ tabblad,\n→ nieuwe regel,\r→ nieuwe regel,\\→ letterlijke backslash.\n,\ren\r\nelke regel een regeleinde (een Enter/VK_RETURN), dustext=line1\nline2entext=line1\r\nline2beide typen één nieuwe regel. Typtext=a\s\sbdus 'a b' (dubbele spatie) entext=\shihoudt een voorloopruimte. Een niet-herkende ontsnapping (bijvoorbeeld\x) is letterlijk. -
Geheel argument letterlijk (
--verbatim) - wanneer de hele nettolading letterlijke tekst is, geeft u door--verbatimin plaats van elk token mettext=te ontsnappen. Het typt het argument voor de hele sleutels precies zoals opgegeven , geen benoemde sleutel / combinatie /vk=/text=interpretatie - en, in tegenstelling tot het normale pad, behoudt exacte interne witruimte (geen samenvouwen) zonder dat dit nodig is.\sTypsend-keys "down down enter" --verbatimdus de woorden ensend-keys "a b" --verbatimhoudt de dubbele spatie. Backslash-escapes worden niet gedecodeerd in--verbatimde modus (een\sis getypt als een backslash en een 's'); gebruik een token wanneer u eentext=escaped-besturingselementteken nodig hebt. -
Onbewerkte virtuele sleutels (
vk=0xNNhex) ofvk=NN(decimaal) voor sleutels zonder een beschrijvende naam.
Opties:
-
--target <selector>— Richt dit element (via UIA) voordat u sleutels verzendt. Zonder dit gaat u naar het momenteel gerichte element van de app. -
--verbatim— Typ het hele toetsenargument als letterlijke tekst (geen sleutel/combinatie/vk=/text=parsering) en behoud exacte witruimte. De gehele argumentvorm van de escape per tokentext=. -
--via <transport>—post-message(standaard) berichtenWM_KEYDOWN//WM_KEYUPWM_CHARin de wachtrij van het doelvenster. Het is gericht op HWND en omzeilt UIPI (werkt tussen integriteitsniveaus).send-inputinjecteert het besturingssysteem breed viaSendInputen gaat naar het voorgrondvenster.
Een transport/ bekende limieten kiezen:
-
post-messageis de standaardinstelling omdat uiPI wordt omzeild en niet afhankelijk is van het venster op de voorgrond. Limieten: er kunnen geen globale sneltoetsen worden geactiveerd die zijn geregistreerd viaWH_KEYBOARD_LLhooks op laag niveau (die tikken op invoer upstream van een vensterwachtrij) en apps die de status van onbewerkte sleutel lezen viaGetAsyncKeyState, kunnen mogelijk geen heldsaanpassingen observeren. Het lost automatisch op en plaatst berichten in het gerichte onderliggende venster van de doelthread (viaGetGUIThreadInfo) na voorgronding, dus klassieke Win32/WinForms-apps waarvan de besturingselementen afzonderlijke onderliggende vensters zijn, ontvangen sleutels zonder handmatig gericht op het besturingselement. WinUI 3/UWP-apps hebben vensterloze XAML-besturingselementen zonder onderliggende HWND, dus een geplaatste appWM_CHAR/WM_KEYDOWNheeft niets om binnen te komen en wordt verwijderd. Post-message kan ze niet sturen (de opdracht waarschuwt en sluit 0); gebruik .--via send-input(WPF vensters zijn single-HWND en routesleutels naar het intern gerichte element, dus post-message werkt daar.) -
send-inputproduceert volledig echte invoer (modifiers zichtbaar voorGetAsyncKeyState, brandt haakjes op laag niveau) maar gaat naar het venster dat voorgrond is en wordt geblokkeerd door UIPI bij het injecteren van een verhoogd proces in een AppContainer/AppX-doel. Alssend-inputer een fout wordt gerapporteerd, is het doel waarschijnlijk verhoogd of een AppX-app. Gebruikpost-messageof voer de CLI uit op een overeenkomend integriteitsniveau. Als veiligheidsbeveiligingsend-inputcontroleert u of het doelvenster zich direct op de voorgrond bevindt voordat u het injecteert en mislukt (foreground_not_target) in plaats van in het verkeerde venster te typen als de focus niet naar het venster kan worden gebracht : focus of klik eerst op het venster. Op een vergrendeld of beveiligd bureaublad mislukt het in plaats daarvan metno_interactive_desktop(er bestaat geen voorgrondvenster om in te injecteren) - ontgrendel de sessie of gebruik een UIA-patroonwoord (set-value,invoke). -
Systeem gereserveerde combinaties (
win+l,win+r,ctrl+shift+esc,ctrl+alt+del,alt+tab, ,ctrl+escalt+f4lonewin/printscreen, ...) handelen op het besturingssysteem/shell in plaats van alleen het doel wanneer het besturingssysteem breed wordt verzonden.send-inputnegeert ze standaard (fouten metinvalid_argumentsen verzendt niets), omdat het injecteren ervan op het niveau van het besturingssysteem veel meer dan het doelvenster heeft (bijvoorbeeldwin+lde sessie vergrendelt). Pass--allow-system-keysto opt in — hiermee kunt u een globale sneltoets zoals PowerToys'win+shift+vofwin+r(de wereldwijde haak op laag niveau kijkt naar de invoerstroom van het besturingssysteem, zodat de geïnjecteerde combinatie deze brandt). Uitzonderingen die geblokkeerd blijven, zelfs bij--allow-system-keys:win+lvergrendelt het werkstation viaLockWorkStation()welke niet kan worden hersteld door automatisering (breekt CI- en extern bureaubladsessies) enctrl+alt+delis een SAS (Secure Attention Sequence) die Windows daalt van geïnjecteerde invoer, ongeacht de vlag, het kan nooit van kracht worden, zodat het fouten (invalid_argumentssluit 1) in plaats van een misleidend succes te melden. Andere combinaties (alt+f4,ctrl+shift+esc,win+r, ...) worden toegestaan met de vlag - bewareer. Als u een systeemcombinatie wilt leveren aan een specifiek venstergebruik--via post-message, wat vensterbereik heeft en niet wordt beïnvloed (een geplaatste iswin+longevaarlijk, hoewel een geplaatste hetalt+f4doelvenster nog steeds sluit).
Gebeurtenissen per toetsaanslag (KeyDown/ TextChanged):
-
Benoemde sleutels en wijzigingscombinaties (
down,enter,ctrl+shift+t,vk=0xNN) activeren een echteKeyDown(enKeyUp) op beide transporten: ze worden geleverd als discreteWM_KEYDOWN/WM_KEYUP(ofSendInputvirtuele-sleutelgebeurtenissen). -
Letterlijk getypte tekst (
hello) verschilt per transport:-
--via send-inputwijst elk teken toe aan de virtuele toets (plus Shift) in de actieve toetsenbordindeling, zodat het doel een echteKeyDownvirtuele toets ziet met de juiste virtuele toets , gevolgd door het op het besturingssysteem samengesteldeWM_CHAR(verhogendeTextChanged) - dat wil bijvoorbeeld één volledige toetsaanslag per teken. Tekens die niet bereikbaar zijn in de huidige indeling (of ctrl/AltGr) moeten terugvallen op een Unicode-pakket, zodat het exacte teken nog steeds terechtkomt. Gebruiksend-inputdeze optie wanneer u per toetsaanslagenKeyDownbetrouwbaarheid nodig hebt (bijvoorbeeld het rijden van een WinUI 3 / WPFTextBoxwaarvan de handlers worden uitgeschakeldKeyDown). Voor een normale (niet-verhoogde) WinUI 3-testhost brengt u het venster eerst naar de voorgrond (winapp ui focus/erop klikken) omdatsend-inputhet gericht is op het voorgrondvenster. -
--via post-messageplaatst éénWM_CHARper teken (deze post nietWM_KEYDOWN/WM_KEYUPvoor getypte tekst, die zijn gereserveerd voor benoemde sleutels/combo's), waardoor er geen per tekenKeyDownwordt gegenereerd. Het wordt automatisch opnieuw gericht op het onderliggende besturingselement van het venster, dus klassieke Besturingselementen voor Win32/WinFormsWM_CHAR-driven edit landt de tekst (verhogenTextChanged). Caveat: WinUI 3 / UWP / XAML-apps (winapp's primaire doel) hebben vensterloze besturingselementen die wordenWM_CHAR/WM_KEYDOWNgenegeerd, dus geen letterlijke tekst of benoemde sleutels (Enter, cijfers, ...) bereiken ze, ook al rapporteert de opdracht is geslaagd. Er wordt een waarschuwing verzonden wanneer het doel eruitziet als XAML en nog steeds 0 afsluit (PostMessageis fire-and-forget en kan de levering niet bevestigen). Gebruik--via send-inputdit om WinUI 3/UWP/WPF-apps aan te sturen; reserveerpost-messagevoor klassieke Win32-besturingselementen of wanneer u deze alleen vensterbereiken nodig hebt voor integriteitsniveaus.
-
JSON-uitvoer (--json): het resultaat hwnd is het effectieve venster waarin de sleutels zijn geleverd. Voor --via post-message dit is het opgeloste onderliggende besturingselement met prioriteit wanneer de opdracht opnieuw wordt gericht (niet noodzakelijkerwijs het venster op het hoogste niveau-w//-a-e), zodat automatisering precies kan bevestigen waar de invoer terecht isgekomen. Wanneer dit effectieve doel eruitziet als een vensterloze XAML-host, wordt de bovenstaande leveringsfout ook weergegeven als een warnings[] vermelding (hetzelfde advies dat op de console wordt weergegeven), zodat een ✅ uitgang 0 niet wordt verward voor bevestigde levering.
set-value
Stel een waarde in op een bewerkbaar element programmatisch (geen toetsaanslagen, geen app voorgrond). Maakt gebruik van een terugvalketen:
- ValuePattern : tekstvak, keuzelijst met invoervak, wachtwoordvak en de meeste bewerkbare besturingselementen.
- RangeValuePattern : numerieke besturingselementen (schuifregelaar, voortgangsbalk) wanneer de waarde als een getal wordt geparseerd.
-
LegacyIAccessible (
IAccessible::put_accValue) - de terugval voor besturingselementen voor alleen textPattern-bewerkingen die geen ValuePattern beschikbaar maken (bijvoorbeeld rich-edit/Documentcompose boxes). Hierdoor wordt de lees-/schrijfruimte gesloten waarget-valueeen dergelijk besturingselement kan worden gelezen, maarset-valueniet.
winapp ui set-value txt-textbox-a4b1 "Hello world" -a notepad
winapp ui set-value sld-volume-b2c3 75 -a myapp
winapp ui set-value doc-compose-9f3a "hello" -a myapp # RichEdit/compose box via LegacyIAccessible
Als geen van de drie patronen de waarde kan instellen, set-value mislukt het met een duidelijke fout die send-keys wijst als laatste redmiddel.
Niet elke uitgebreide editor ondersteunt programmatische set. De LegacyIAccessible-terugval werkt alleen op besturingselementen waarvan de toegankelijkheid implementeert
IAccessible::put_accValue: systeemeigen Besturingselementen voor uitgebreide bewerking en Chromium/Electron/WebView2 opstellen oppervlakken meestal. WinUI 3RichEditBoxen WPFRichTextBoxbieden geen ondersteuning voor programmatische waarde-instelling. Ze maken hun inhoud standaard zichtbaar voor UI Automation als alleen-lezen (tekstpatroon, geen settabelwaardepatroon), zodatset-valueze er niet naar kunnen schrijven. Gebruiksend-keys(waarvoor een ontgrendeld bureaublad op de voorgrond nodig is) voor deze.
get-value
Lees de huidige waarde van een element. Maakt gebruik van een slimme terugvalketen: TextPattern (RichEditBox, Document) → ValuePattern (TextBox, Slider) → SelectionPattern (ComboBox, RadioButton, TabView) → Naam (labels).
winapp ui get-value doc-texteditor-53ad -a notepad # read full document text
winapp ui get-value SearchBox -a myapp # read TextBox content
winapp ui get-value CmbTheme -a myapp # read ComboBox selected item
winapp ui get-value sld-volume-b2c3 -a myapp # read Slider value
winapp ui get-value lbl-title-a1b2 -a myapp --json # JSON: { "elementId": "...", "text": "..." }
focus
Verplaats de focus van het toetsenbord naar een element.
winapp ui focus txt-textbox-a4b1 -a notepad
scroll-into-view
Schuif een element naar het zichtbare gebied.
winapp ui scroll-into-view itm-targetitem-c3d4 -a myapp
wachten op
Wacht tot een element wordt weergegeven, verdwijnt of heeft een waarde een doel bereikt.
winapp ui wait-for Button -a myapp --timeout 5000 # wait for any button
winapp ui wait-for btn-submit-7a90 -a myapp --timeout 5000 # wait for specific element
winapp ui wait-for CounterDisplay -a myapp --value "5" --timeout 5000 # wait for element value (smart fallback)
winapp ui wait-for lbl-status -a myapp --property Name --value "Done" --timeout 5000 # wait for specific property
winapp ui wait-for btn-submit-a1b2 --gone -a myapp --timeout 2000 # wait for element to disappear
winapp ui wait-for lbl-status -a myapp --value "Done" --contains # substring match instead of exact equality
Schuiven
Schuif door een containerelement. Schuifbare containers zoeken met search scroll : zoek [scroll:v] naar (verticale) of [scroll:h] (horizontale) markeringen.
# Find which elements are scrollable and in which direction
winapp ui search scroll -a myapp
# pn-scrollview-bfef Pane "scrollView" [scroll:v] (main content, vertical)
# pn-scrollviewer-bfb1 Pane "scrollViewer" [scroll:h] (horizontal list)
# Scroll the main content down
winapp ui scroll pn-scrollview-bfef --direction down -a myapp
# Jump to top/bottom
winapp ui scroll pn-scrollview-bfef --to bottom -a myapp
# If you target an element that's not scrollable, scroll walks up to find the nearest scrollable parent
winapp ui scroll itm-someitem-a1b2 --direction down -a myapp
# Synthesize real mouse-wheel input over the element (1 = one notch up, -1 = one notch down).
# Use this to test handlers that respond to the wheel directly (zoom, custom scroll) rather than ScrollPattern.
winapp ui scroll img-map-a1b2 --wheel -1 -a myapp
Opties:
-
--direction <up|down|left|right>— Schuif stapsgewijs viaScrollPattern. -
--to <top|bottom>— Ga naar het begin/einde viaScrollPattern. -
--wheel <notches>— Synthetiseer de invoer van het muiswiel over het midden van het element viaSendInput, in wielkepingen (tenten):1= één inkeping omhoog/weg,-1= één inkeping naar beneden/naar,3= drie inkepingen omhoog. (Elke notch is de WindowsWHEEL_DELTAvan 120 eenheden dieSendInputverbruiken; de CLI schaalt met 120 voor u.) OmzeiltScrollPattern.
--direction,--toen--wheelsluiten elkaar wederzijds uit - geef precies één door. Omdat--wheelhet besturingssysteembrede invoer op schermcoördinaten injecteert, wordt het doel eerst op de voorgrond geplaatst en mislukt (foreground_not_target) als de focus niet kan worden overgedragen, in plaats van het verkeerde venster te schuiven.
get-focused
Het element weergeven dat momenteel de toetsenbordfocus heeft.
winapp ui get-focused -a myapp
list-windows
Alle zichtbare vensters voor een app weergeven, inclusief pop-ups en dialoogvensters. Standaard worden naamloze vensters met nulgrootte (onzichtbare systeemvensters) uitgesloten.
winapp ui list-windows -a imageresizer
winapp ui list-windows -a Terminal
winapp ui list-windows # all windows (no filter)
winapp ui list-windows --show-hidden # include invisible zero-size windows
Framework-ondersteuning
| Raamwerk | Inspecteren | search | aanroepen | set-value | schermopname |
|---|---|---|---|---|---|
| WPF | ✅ Volledige structuur | ✅ Alle eigenschappen | ✅ Alle patronen | ✅ ¹ | ✅ |
| WinForms | ✅ | ✅ | ✅ | ✅ | ✅ |
| Win32 | ✅ | ✅ | ✅ | ✅ | ✅ |
| WinUI 3 | ✅ | ✅ | ✅ | ✅ ¹ | ✅ |
| Elektron | ⚠✍ Chroomboom | ⚠️ Beperkt | ⚠ϑ varieert | ⚠ϑ varieert | ✅ |
| Flutter | ⚠️ Basis | ⚠️ Basis | ❌ Minimale | ❌ | ✅ |
¹ set-value werkt op elk besturingselement dat ValuePattern/RangeValuePattern weergeeft, plus besturingselementen voor bewerken met alleen TextPattern waarvan de toegankelijkheid wordt geïmplementeerd IAccessible::put_accValue (LegacyIAccessible fallback).
WinUI 3 RichEditBox en WPF RichTextBox zijn uitzonderingen: ze maken alleen het alleen-lezen tekstpatroon (geen instelbaar waardepatroon) beschikbaar, zodat ze niet programmatisch kunnen worden ingesteld op basis van ontwerp; gebruik send-keys (interactief bureaublad vereist) om erin te typen.
Troubleshooting
| Fout | Oorzaak | Oplossing |
|---|---|---|
| "Er is geen actieve app gevonden" | App wordt niet uitgevoerd of de naam komt niet overeen | Procesnaam controleren of PID gebruiken |
| "Meerdere vensters komen overeen" | Dubbelzinnige -a waarde |
Gebruiken -w <HWND> vanuit de vermelde opties |
| "heeft meerdere vensters" | Proces heeft meerdere vensters | Gebruiken -w <HWND> om een specifiek doel te bereiken |
| "Selector matched N elements" | Dubbelzinnige verouderde selector | Slugs uit inspect uitvoer gebruiken of toevoegen [0]aan [1] verouderde selectors |
| "Element kan zijn gewijzigd" | Slug-hash komt niet overeen met het huidige element | Opnieuw uitvoeren inspect of search verse slugs krijgen |
| "biedt geen ondersteuning voor een aanroeppatroon" | Het element kan niet worden aangeroepen | Op inspect het element gebruiken om een aanroepbaar onderliggend element te zoeken |
| "Geen UIA-venster gevonden" | UIA kan het proces niet zien | Gebruik list-windows deze om de HWND te vinden en vervolgens -w |
| "Venster heeft nulgrootte" | Venster is geminimaliseerd | De app wordt automatisch hersteld |
| Pop-up/vervolgkeuzelijst niet in schermopname | Standaardopname is per venster en bevat geen niet-gekoppelde overlays | Vlag gebruiken --capture-screen |
element_not_found tijdens record |
Opgegeven selector, maar geen overeenkomend element | Opnieuw uitvoeren inspect of search een nieuwe selector ophalen |
| WGC niet beschikbaar tijdens record | WGC capture init is mislukt; geen stille terugval | GPU/stuurprogramma controleren; gebruiken --capture-screen om toestemming te geven voor scherm-DC-opname |
Algemene patronen
Navigeren en controleren
winapp ui invoke btn-settings-a1b2 -a myapp # click a button
winapp ui wait-for pn-settingspage-c3d4 -a myapp # wait for page to load
winapp ui screenshot -a myapp --output settings.png # verify visually
Tekst zoeken en het bovenliggende item aanroepen
# Search shows invokable ancestor; invoke auto-walks to it
winapp ui invoke 'Save changes' -a myapp
# Or search first to see what matches, then invoke
winapp ui search "Save changes" -a myapp; winapp ui invoke btn-save-c3d4 -a myapp
Dubbele elementen ondubbelzinnig maken
winapp ui search '#Image' -a myapp; winapp ui invoke itm-image-a2b3 -a myapp
Schermopname met pop-up-overlays
winapp ui set-value txt-searchbox-e5f6 "query" -a myapp; winapp ui screenshot -a myapp --capture-screen
Navigeren, wachten en controleren (enkele keten)
winapp ui invoke btn-settings-a1b2 -a myapp; winapp ui wait-for pn-settingspage-c3d4 -a myapp --timeout 3000; winapp ui screenshot -a myapp -o settings.png
Ontdekken, klikken en controleren
winapp ui inspect -a myapp --interactive; winapp ui invoke btn-submit-7a90 -a myapp; winapp ui screenshot -a myapp
Interactie in dialoogvenster Bestand
Dialoogvensters voor openen/opslaan van bestanden zijn standaarddialoogvensters Windows met UIA-ondersteuning:
# Trigger the dialog, find it, type the path, confirm
winapp ui invoke btn-openfilebtn-a2b3 -a myapp
winapp ui list-windows -a myapp # find dialog HWND
winapp ui set-value txt-1148-c4d5 "C:\path\to\file.png" -w <dialog-hwnd>
winapp ui invoke btn-open-e6f7 -w <dialog-hwnd>
Gebruik inspect -w <dialog-hwnd> --interactive deze functie om de werkelijke slugs voor een specifiek dialoogvenster te ontdekken.
Waarom ; ketenen (niet &&)
De operator van && PowerShell kan blokkeren wanneer een systeemeigen CLI schrijft naar stderr of ANSI-escapereeksen gebruikt. In ; plaats daarvan wordt elke opdracht voorwaardelijke uitgevoerd en wordt deze impasse vermeden. Dit is ook beter voor agentwerkstromen: meestal wilt u dat de schermafbeelding wordt uitgevoerd, zelfs als de aanroep een afsluit zonder nul heeft.
CI-testpatronen
Gebruik winapp ui opdrachten in CI-pijplijnen (GitHub Actions, Azure DevOps) voor betrouwbaarheidstests en ui-validatie.
wait-for met --property en --value fungeert als een assertie: het retourneert afsluitcode 1 bij time-out, waarbij de CI-stap automatisch mislukt.
Starten en testen in GitHub Actions
steps:
- name: Build
run: dotnet build MyApp.csproj -c Debug -p:Platform=x64
- name: Launch and test
run: |
$result = winapp run .\bin\x64\Debug\net8.0-windows10.0.26100.0\win-x64 --detach --json | ConvertFrom-Json
$appPid = $result.ProcessId
# Wait for window to initialize
winapp ui wait-for "Main Window" -a $appPid --timeout 30000
# Run tests — each wait-for exits non-zero on failure
winapp ui invoke "Login" -a $appPid
winapp ui wait-for "Dashboard" -a $appPid --timeout 10000
winapp ui screenshot -a $appPid -o dashboard.png
Status van element assertie met wait-for
wait-for --value pollt totdat de waarde van een element overeenkomt met de verwachte tekenreeks, waarbij dezelfde slimme terugval wordt gebruikt als get-value (TextPattern → ValuePattern → SelectionPattern → Name). Retourneert afsluitcode 0 bij overeenkomst, afsluitcode 1 bij time-out, waardoor deze een CI-vriendelijke assertie is. Gebruik --property in plaats daarvan om een specifieke UIA-eigenschap te controleren.
# Assert: button click updated the counter (smart value fallback — works for TextBlock, TextBox, etc.)
winapp ui invoke "Counter Button" -a $pid
winapp ui wait-for "Counter Display" -a $pid --value "Count: 1" -t 5000
# Assert: text input was accepted
winapp ui set-value "Search Box" "hello world" -a $pid
winapp ui wait-for "Search Box" -a $pid --value "hello world" -t 3000
# Assert: checkbox was toggled (use --property for specific UIA properties)
winapp ui invoke "Dark Mode" -a $pid
winapp ui wait-for "Dark Mode" -a $pid --property ToggleState --value "On" -t 3000
# Assert: navigation happened (new page appeared)
winapp ui invoke "Settings" -a $pid
winapp ui wait-for "Settings Page" -a $pid -t 10000
# Assert: dialog was dismissed (element disappeared)
winapp ui invoke "Close" -a $pid
winapp ui wait-for "Dialog Title" -a $pid --gone -t 5000
Assert met JSON-uitvoer
Gebruik --json met PowerShell of jq voor complexere asserties:
Afsluitcodecontract voor
searchenwait-forin--jsonde modus: als er geen element overeenkomt (search) of de wachttijd (wait-for), schrijft de opdracht een volledig parseerbare resultaatenvelop naar stdout ({ "matchCount": 0, ... }of{ "found": false, "timedOut": true, ... }) en retourneert afsluitcode 1. Stderr is leeg in--jsonde modus (loggeruitvoer wordt onderdrukt). Vertakking op de envelopvelden, of op$LASTEXITCODE, afhankelijk van welke ergonomischer is.
# Assert: search found exactly one match
$result = winapp ui search "Submit" -a $pid --json | ConvertFrom-Json
if ($result.matchCount -ne 1) { throw "Expected 1 Submit button, found $($result.matchCount)" }
# Assert: element has expected properties
# inspect --json returns { windows: [{ hwnd, title, elements: [...] }] };
# each window's elements[] is the nested tree (children rendered via .children).
$tree = winapp ui inspect "Counter Display" -a $pid --json | ConvertFrom-Json
$counter = $tree.windows[0].elements[0]
if ($counter.name -ne "Count: 3") { throw "Counter value wrong: $($counter.name)" }
Voorbeeld van een volledige betrouwbaarheidstest
# Launch
$app = winapp run .\build-output --detach --json | ConvertFrom-Json
# Verify app loaded
winapp ui wait-for "Main Page" -a $app.ProcessId -t 30000
# Interact and assert
winapp ui invoke "Add Item" -a $app.ProcessId
winapp ui set-value "Item Name" "Test Item" -a $app.ProcessId
winapp ui invoke "Save" -a $app.ProcessId
winapp ui wait-for "Test Item" -a $app.ProcessId -t 5000 # assert item appeared in list
winapp ui wait-for "Save" -a $app.ProcessId --gone -t 3000 # assert save dialog closed
# Visual verification
winapp ui screenshot -a $app.ProcessId -o smoke-test.png
Windows developer