Simulace vstupu v UWP aplikacích

Jednou z méně známých funkcí UWP API je možnost simulace vstupu (input injection). Tu lze s výhodou využít, když chcete uživateli nabídnout automatickou prohlídku aplikací, poskytnout zpětnou vazbu uživatelům asistenčních technologií nebo implementovat ve vaší aplikaci možnost vzdálené pomoci. V tomto článku si prohlédneme jmenný prostor Windows.UI.Input.Preview.Injection a ukážeme si, jak používat jeho členy.

Podporované formy vstupu

Windows 10 podporuje několik různých forem vstupu a všechny lze použít i se simulátorem vstupu v UWP API. Lze simulovat:

  • Gamepad
  • Klávesnici
  • Myš
  • Pero
  • Dotyk

V článku se podíváme na simulaci klávesnice a myši.

Deklarace simulace vstupu

Předtím než budeme moci simulaci vstupu využít, musíme to deklarovat v aplikačním manifestu, protože jde o nestandardní funkcionalitu. Patří do kategorie restricted capability, což znamená že výslednou aplikaci můžeme publikovat na Windows Store, ale vyžaduje rozšířenou kontrolu při schvalovacím procesu.

Otevřeme Package.appxmanifest jako XML soubor a doplníme o novou deklaraci jmenného prostoru v elementu Package:

Jmenný prostor rescap je domovem pro všechny restricted capabilities. Dále musíme přidat samotnou capability inputInjectionBrokered v sekci Capabilities:

Základy

Hlavní třídou ve jmenném prostoru Windows.UI.Input.Preview.Injection je  InputInjector. Její instanci vytvoříme pomocí statické metody TryCreate. Následně můžeme volat odpovídající metody pro každou z forem vstupu:

Jak lze vidět, tyto metody přijímají seznam instancí input info, takže můžeme provést více operací za sebou.

Vstup myši

Simulovaný vstup myši můžeme připravit pomocí třídy InjectedInputMouseInfo. Pro pohyb myší použijeme vlastnosti DeltaX a DeltaY:

Vlastnost MouseOptions nám umožňuje nastavit flagy, které určují operace, jež se mají provést. Mezi těmi jsou i LeftDown a LeftUp, kterými můžeme simulovat kliknutí levého tlačítka myši:

Můžeme ale simulovat i scrollovací kolečka myši a to jak vertikální tak horizontální pomocí vlastností Wheel resp. HWheel. Vzdálenost pro scrollování můžete nastavit vlastností MouseData:

Scrollování nahoru je snadné, ale co dolů?

Překvapivě, vlastnost MouseData je typu uint, což znemožňuje přiřazení záporných hodnot. Můžeme však využít přetečení, jehož důsledek bude očekávané chování:

V tomto případě musíme použít unchecked blok, protože používáme konstantu a kompilátor se brání numerickému přetečení. Pokud bychom použili dočasnou lokální proměnnou, kompilátor by si již problému nemohl “všimnout” a nemuseli bychom unchecked používat.

Info pro vstup myší také zahrnuje vlastnostTimeOffsetInMilliseconds, přes kterou můžete nastavit zpoždění jednotlivých akcí. To je užitečné pro korektní simulací oprací jako je dvojklik.

Vstup klávesnice

Třída InjectedInputKeyboardInfo je základem pro simulaci vstupu z klávesnice. Nejdůežitější vlastnost je VirtualKey, která určuje klávesu, se kterou pracujeme.

Následující příklad vypíše do aktivního vstupního pole řetězec “hello”:

Na konci cyklu je volání metody Task.Delay, které zde není jen pro efekt 😀 . Zajišťuje, že opakované stisky kláves nebudou zaregistrovány jako jedno stisknutí, což by zabránilo zaregistrování druhého písmena L.

Ukázkový kód

Zdrojový kód k tomuto článku je k dispozici na mém GitHubu.

Input injection sample app
Ukázková aplikace pro simulaci vstupu

Shrnutí

Prohlédli jsme si jmenný prostor Windows.<wbr />UI.<wbr />Input.<wbr />Preview.<wbr />Injection a ukázali, jak jej můžeme využít pro simulaci vstupních zařízení. Přestože tuto funkci příliš často nevyužijeme, je velmi pěkné ji vidět jako součást UWP API.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.