Одной из наименее известных возможностей UWP приложений является встраивание ввода данных. Это будет особенно полезно, если Вы хотите предоставить пользователям ознакомительную инструкцию, мгновенную обратную связь с помощью дополнительных технологий или реализовать вкладку Help в приложении. Рассмотрим подробнее преимущества пространства имен Windows.UI.Input.Preview.Injection и его внедрение в приложения.
Поддерживаемые типы ввода
Windows 10 поддерживает несколько типов ввода. В настоящее время это:
- Геймпад
- Клавиатура
- Мышка
- Стилус
- Сенсор
В этой статье будут приведены примеры ввода с помощью клавиатуры и мышки.
Возможность внедрения ввода
Прежде чем использовать внедрение ввода, необходимо указать эту возможность в манифесте приложения, так как это нестандартная функция. Это ограниченная возможность, поэтому Вы можете безопасно отправлять на сертификацию и публиковать Ваше приложение в Store.
Добавление этой возможности простое и понятное. Откройте Package.appxmanifest как XML-файл и добавьте следующее описание пространства имен в Package элемент:
<Package
...
xmlns:rescap="http://schemas.microsoft.com/appx/manifest /foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp rescap">
Пространство имен rescap - это хранилище для ограниченных возможностей. Теперь Вы можете добавить функцию inputInjectionBrokered в разделе Capabilities:
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="inputInjectionBrokered" />
</Capabilities>
Основы
Основным классом в Windows.UI.Input.Preview.Injection является InputInjector. Вы можете создать его образец, вызвав статический TryCreate метод. После чего Вы можете вызвать соответствующие методы для каждого типа ввода:
var inputInfo = new InjectedInputMouseInfo();
...
InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { inputInfo });
Методы принимают список данных ввода, поэтому Вы можете последовательно выполнять несколько операций ввода.
Ввод с мышки
Вы можете подготовить информацию ввода с помощью мышки, используя InjectedInputMouseInfo класс. Чтобы двигать мышкой, используйте DeltaX и DeltaY свойства:
var info = new InjectedInputMouseInfo();
info.MouseOptions = InjectedInputMouseOptions.Move;
info.DeltaY = 100; //move down 100 points
Свойство MouseOptions позволяет указывать места, которые влияют на выполнение действий. Среди них LeftDown и LeftUp, которые можно использовать для имитации простого щелчка мышки:
var down = new InjectedInputMouseInfo();
down.MouseOptions = InjectedInputMouseOptions.LeftDown;
var up = new InjectedInputMouseInfo();
up.MouseOptions = InjectedInputMouseOptions.LeftUp;
InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { down, up });
Вы также можете имитировать как вертикальный, так и горизонтальный скрол мышки, используя Wheel и HWheel. Вы можете указывать расстояние прокрутки, используя свойство MouseData:
var info = new InjectedInputMouseInfo();
info.MouseOptions = InjectedInputMouseOptions.Wheel;
info.MouseData = 500; //scroll up
InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { info });
Прокрутка - это легко. Но как насчет прокрутки вниз?
info.MouseData = -500; //compile time error!
Обратите внимание, что свойство MouseData - это uint единица, которой нельзя присвоить отрицательные значения.
unchecked
{
info.MouseData = (uint)-500; //scroll down
}
В этом случае Вы должны использовать непроверенный блок, потому что значение считается постоянным, а компилятор жалуется, что это приведет к числовой перегрузке. Если использовать временную локальную переменную, можно избежать необходимости использовать непроверенный блок.
Ввод с мышкой также содержит свойство TimeOffsetInMilliseconds, которое можно установить для задержки отдельных действий. Это свойство рекомендуется для правильной имитации операций, таких как двойной щелчок.
Ввод с клавиатуры
Класс InjectedInputKeyboardInfo является базой для внедрения ввода с клавиатуры. Наиболее важное свойство - VirtualKey, которое указывает, к какому ключу относится ввод. Используя KeyOptions, Вы можете указывать дополнительные опции, такие как симуляция key up события.
Следующий образец показывает строку «привет» в активном поле ввода:
InputInjector inputInjector = InputInjector.TryCreate();
foreach (var letter in "hello")
{
var info = new InjectedInputKeyboardInfo();
info.VirtualKey = (ushort)((VirtualKey)Enum.Parse(typeof(VirtualKey),
letter.ToString(), true));
inputInjector.InjectKeyboardInput(new[] { info });
await Task.Delay(100);
}
В конце foreach узла находится Task.Delay вызов. Это гарантирует, что повторные нажатия клавиш не регистрируются как одно нажатие.
Образец кода
Исходный образец кода доступен на GitHub.
В заключении
В этой статье мы подробно изучили пространство имен Windows.<wbr />UI.<wbr />Input.<wbr />Preview.<wbr />Injection и посмотрели, как его можно использовать для имитации ввода с разных типов устройств. Не смотря на то, что эта опция не так часто используется, она все же полезна в UWP API.
Дополнительная нформации
Exception: Collection was modified after the enumerator was instantiated.