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

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[];
InjectedInputKeyboardInfo keyinfo = new InjectedInputKeyboardInfo();
keyinfo.VirtualKey = (ushort)c;
InjectedInputKeyboardInfo[] infos =
{
keyinfo
};
// 让文本框获得键盘焦点,不然输不进去
txt.Focus(FocusState.Keyboard);
injector.InjectKeyboardInput(infos);
}

这段代码也很简单,一排按钮,它们的Content属性分别是字母A B C D E F G,当按钮被点击后,取出这个字符,并用 Char 类型表示,为啥要用它呢,这是为了可以转换为整数值,因为键码实际是字符的ASCII码。

得到键码后,赋值给 InjectedInputKeyboardInfo 对象的 VirtualKey 属性,就指定了要按下哪个键了。

这里有一点各位要注意,就是在你发送输入行为前一定要加这一行。

txt.Focus(FocusState.Keyboard);

你想啊,要模拟键盘把字符输入到输入框中,所以你得先确保这个输入框已经获得键盘焦点。

示例完成后,你一定会兴高采烈地运行,结果……

想哭吧? 别哭,你又不是林妹妹,哭什么。

此时你一查 SDK 文档,一拍脑子,是了,这么木马般的行为怎么轻易调用呢,一定要配置清单文件。这种高级行为需要在清单文件中引入这个命名空间:

http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities

然后,你看了文档,知了,要加入这个声明:

  <Capabilities>
<Capability Name="internetClient" />
<restcap:Capability Name="inputInjection" />
</Capabilities>

是的,这个思路也没有错,而且,如果你的应用要提交到应用商店的话,也要这样声明。

然而,当你再次运行的时候,你又想哭了。

这TMD怪了,怎么还是无权限访问呢,因为你懂的,太敏感的行为,你是得到应用商店上申请合作,才能使用的。

是不是就不能用了呢。其实不是的,下面老周告诉你答案。

你应该把 Capability 的 Name 改为 inputInjectionBrokered。就是这样改。

  <Capabilities>
<restcap:Capability Name="inputInjectionBrokered" />
</Capabilities>

这个秘密老周忍不住告诉大伙了,老周花了五毛钱买通了微软的开发团队得到了这个秘密。

好,这样改了以后,你一定会微笑着面对生活的,看看效果。

惊喜吧。

惊喜完了之后,老周告诉你一个坏消息,这样处理后是不能提交到应用商店的

好了,老周就分享到这里了,该开饭了,今天晚上大厨子阿强要请我和几个哥们吃饭,他老人家亲自下厨。所以,这博文该收尾了。

示例代码下载:http://files.cnblogs.com/files/tcjiaan/inputInjectionSample.zip

【Windows 10 应用开发】输入模拟的更多相关文章

  1. Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建

    目前,微软针对Windows IoT计划支持的硬件包括树莓派2,Minnow Board MAX 和Galileo (Gen 1和Gen 2).其中,Galileo (Gen 1和Gen 2)运行的是 ...

  2. 打造理想的Windows 10 APP开发环境的5个步骤

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows ...

  3. Windows 10 UWP开发:如何去掉ListView默认的选中效果

    原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...

  4. 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号

    考虑到 Raspberry Pi 读取模拟信号是很烦人的事情,更何况是在没人玩的 Windows 10 IoT 下,所以准备正儿八经的写点东西. 需求:使用 Raspberry Pi 读取输出模拟信号 ...

  5. 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED

    感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

    HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...

  7. 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

    BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 ...

  8. 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用

    今天是大年初二,都去走亲戚了吧,享受一下这难得的能和亲友相聚的时光.而我就不一样了,今天一回到家就又开始瞎折腾了,哈哈哈. 问题背景 最近花了点时间用 ASP.NET Core 2 写了个个人博客,中 ...

  9. 张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub: https://github.c ...

  10. 张高兴的 Windows 10 IoT 开发笔记:无线收发芯片 nRF24L01

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...

随机推荐

  1. 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 概念简介

    什么是桌面虚拟化? 桌面虚拟化有很多概念,此处谈论的,是指的一般企业使用的“服务器 + 虚拟机 + 云终端”的方式来实现的. 桌面虚拟化的原理是什么? 桌面虚拟化看上去高大上,实际上原理非常的简单.拿 ...

  2. (十) Jquery的基本使用

    一.引入 注意:如果在index.js中有使用到JQuery.js 那么JQuery.js文件必须比index.js文件先引入,否则index.js文件中不能使用JQuery.js. <scri ...

  3. Maven settings.xml配置解读

    本文对${maven.home}\conf\settings.xml的官方文档作个简单的解读,请确保自己的maven环境安装成功,具体安装流程详见Maven安装 第一步:看settings.xml的内 ...

  4. mongoDB & Nodejs 访问mongoDB (二)

    非常详细的文档http://mongodb.github.io/node-mongodb-native/2.2/quick-start/quick-start/ 连接数据库 安装express 和 m ...

  5. 3391: [Usaco2004 Dec]Tree Cutting网络破坏

    3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 76  Solved: 59[ ...

  6. PowerDesigner建模应用(二)逆向工程,导出PDM文件前过滤元数据(表、视图、存储过程等)

    在上一篇文章<PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下 ...

  7. Java 中的锁——Lock接口

    Java SE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能.虽然它少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的操作性. ...

  8. 帝国CMS万能标签的使用

    标签名称: 带模板的信息调用标签[万能标签]   [ecmsinfo]栏目ID/专题ID,显示条数,标题截取数,是否显示栏目名,操作类型,标签模板ID,只显示有标题图片[/ecmsinfo] 说明:e ...

  9. "the hypervisor is not running" 故障

    在我们日常服务器管理中,常常会遇到创建虚拟机,如果在一台新部署的 Hyper-V 上新建一个 Virtual Machine 时,出现错误信息:"The virtual machine co ...

  10. layer插件

    最近在做公司的官网,其中有用到layer这款插件,以前没有接触过,不过学下来觉得好用好学.下面分享一下我的学习心得. layer是web弹出层组件.在官网下载好layer后,把他部署到你的项目文件中( ...