【Windows 10 应用开发】输入模拟

时间:2022-02-20 01:15:14

---恢复内容开始---

Input Injection 直译为:输入注入。通俗的译法为:模拟输入。此注入行为可以模拟以下几种输入行为:

1、键盘按键。

2、鼠标。

3、触控。

4、书写笔输入。

5、快捷键。这个有限制,仅限于如按 Win 键、后退键。

支持输入行为注入的API都在 Windows.UI.Input.Preview.Injection 命名空间下,命名空间带有 【Preview】字样,估计这个功能还在试运行阶段。

这个所谓的注入功能,简单地说就是可以在UWP应用中模拟键盘输入、鼠标操作等行为,当然,根据UWP的安全性方案,不可能像过去 Win 32 那样让你到处乱注,在UWP中,你只能注入当前进程中的UI行为,意思你懂的,不用多说,就是你的应用只能干你的事,不要搔扰别人。

老周个人觉得这个注入 API 没什么用,不过既然 SDK 中有,咱们就了解一下吧。

由于这堆 API 是受限制的,所以很多朋友尝试调用,结果发生了异常。好,先卖个关子,,后文再谈。

还是老规矩,先给大伙说说怎么用。其实也很简单,核心类是 InputInjector, 这个类你不能调用构造函数,要使用它,你要调用静态方法 TryCreate ,调用后会返回一个 InputInjector 实例。

然后,你可以根据需要调用以下方法来发送输入行为。

1、InjectTouchInput,模拟手指触控行为,参数是一组 InjectedInputTouchInfo 实例,每个 InjectedInputTouchInfo 实例代表一次触控,主要参数有触控点坐标,角度(比如双指旋转,方向为逆时针),力度。

2、InjectMouseInput,模拟鼠标。方法参数由一组 InjectedInputMouseInfo 对象组成,单个 InjectedInputMouseInfo 对象描述鼠标坐标、左键按下或者弹起,等等。

3、InjectPenInput,模拟笔的输入(如电磁笔),数据由一个 InjectedInputPenInfo 对象描述,如笔尖按下的位置等。

4、InjectKeyboardInput,模拟键盘输入,数据由一组 InjectedInputKeyboardInfo 对象描述,对数内容大伙都能猜到,当然就跟要按下的键的虚键码有关。

好,下面老周弄个模拟键盘输入的示例。

<StackPanel Margin="20"> <TextBox Name="txt" /> <StackPanel Margin=" 2,15" Orientation="Horizontal"> <Button Content="A" Style="{StaticResource btnst}" Click="OnClick"/> <Button Content="B" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="C" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="D" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="E" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="F" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="G" Style="{StaticResource btnst}" Click="OnClick" /> </StackPanel> </StackPanel>

界面没什么玄机,一个 TextBox 当然是用来接收输入的,其他一串 Button 当然是模拟键盘按钮。

这些按钮都共享同一个Click事件处理方法——OnClick。

接下来是写处理代码。

首先,在页面类级别声明变量。

InputInjector injector = null; …… injector = InputInjector.TryCreate();

随后处理Click事件。

private void OnClick(object sender, RoutedEventArgs e) { Button btn = (Button)sender; string content = btn.Content as string; char c = content[0]; InjectedInputKeyboardInfo keyinfo = new InjectedInputKeyboardInfo(); keyinfo.VirtualKey = (ushort)c; InjectedInputKeyboardInfo[] infos = { keyinfo }; // 让文本框获得键盘焦点,不然输不进去 txt.Focus(FocusState.Keyboard); injector.InjectKeyboardInput(infos); }