设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 511|回复: 0

[经验分享] 【Windows 10 应用开发】输入模拟

[复制链接]

尚未签到

发表于 2017-6-28 11:49:24 | 显示全部楼层 |阅读模式
  ---恢复内容开始---
  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);
}
  这段代码也很简单,一排按钮,它们的Content属性分别是字母A B C D E F G,当按钮被点击后,取出这个字符,并用 Char 类型表示,为啥要用它呢,这是为了可以转换为整数值,因为键码实际是字符的ASCII码。
  得到键码后,赋值给 InjectedInputKeyboardInfo 对象的 VirtualKey 属性,就指定了要按下哪个键了。
  这里有一点各位要注意,就是在你发送输入行为前一定要加这一行。



txt.Focus(FocusState.Keyboard);
  你想啊,要模拟键盘把字符输入到输入框中,所以你得先确保这个输入框已经获得键盘焦点。
  示例完成后,你一定会兴高采烈地运行,结果……
DSC0000.png

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



http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities
  然后,你看了文档,知了,要加入这个声明:



  <Capabilities>
<Capability Name="internetClient" />
<restcap:Capability Name="inputInjection" />
  </Capabilities>
  是的,这个思路也没有错,而且,如果你的应用要提交到应用商店的话,也要这样声明。
  然而,当你再次运行的时候,你又想哭了。
DSC0001.png

  这TMD怪了,怎么还是无权限访问呢,因为你懂的,太敏感的行为,你是得到应用商店上申请合作,才能使用的。
  是不是就不能用了呢。其实不是的,下面老周告诉你答案。
  你应该把 Capability 的 Name 改为 inputInjectionBrokered。就是这样改。



  <Capabilities>
<restcap:Capability Name="inputInjectionBrokered" />
</Capabilities>
  这个秘密老周忍不住告诉大伙了,老周花了五毛钱买通了微软的开发团队得到了这个秘密。
  好,这样改了以后,你一定会微笑着面对生活的,看看效果。
DSC0002.png

  惊喜吧。
  惊喜完了之后,老周告诉你一个坏消息,这样处理后是不能提交到应用商店的
  好了,老周就分享到这里了,该开饭了,今天晚上大厨子阿强要请我和几个哥们吃饭,他老人家亲自下厨。所以,这博文该收尾了。
  示例代码下载:http://files.cnblogs.com/files/tcjiaan/inputInjectionSample.zip

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388948-1-1.html 上篇帖子: 背水一战 Windows 10 (41) 下篇帖子: Windows 7 安装Keras
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表