原文:2019-11-29-WPF-客户端开发需要知道的触摸失效问题

title author date CreateTime categories
WPF 客户端开发需要知道的触摸失效问题
lindexi
2019-11-29 8:50:2 +0800
2019-9-18 10:3:57 +0800
WPF

在说 WPF 开发的时候,如果开发的应用是触摸应用,那么熟悉的小伙伴会说到触摸失效问题。从分类上触摸失效有系统的触摸失效,应用程序的触摸失效,同时触摸失效指的不是触摸没反应,本文详细告诉大家什么是触摸失效

在说触摸失效时,需要先知道有多少分类。首先是系统触摸失效还是应用触摸失效,所有的触摸失效本身都分为两个不同失效的方式,一个是全触摸失效,另一个是多指触摸失效了,请看下图

触摸失效 全触摸失效 多指触摸失效
系统触摸失效 系统桌面用触摸点不了任何内容,但是用鼠标可以在任何应用都无法使用触摸,但是鼠标可以 系统的触摸都转鼠标,开启触摸点反馈的时候发现只有鼠标光标显示,没有显示触摸光标。无法在系统和任何应用使用多指触摸
应用触摸失效 在某个应用里面无法用触摸,但是可以使用鼠标 在应用里面所有触摸都转鼠标,也就是收不到Touch事件,同时收不到多指触摸

系统触摸失效和应用触摸失效的不同在于,应用触摸失效只对某个应用,在其他应用或还是此应用重启之后可能就可以使用触摸了。如果是系统触摸失效了,大概就和没有触摸设备一样,所有的应用和系统都触摸失效

触摸失效的全触摸失效是就像没有触摸设备所有触摸没有响应,但是鼠标可以响应。而多指触摸失效是触摸不支持多指,但是可以转换为单指触摸或转为鼠标,相当于是鼠标点击

在应用程序里面还有瞬时触摸失效问题,这时的瞬时触摸失效就是某次触摸没有响应,但是此后应用程序能恢复触摸

对于不同的触摸失效问题对应不同的方法

在应用程序里面的触摸失效请看WPF 程序无法触摸操作?我们一起来找原因和解决方法! - walterlv

在应用程序的触摸失效可以分为启动前和运行过程,如果应用程序在启动前就已经触摸失效了,那么和应用程序本身的代码执行无关。在 Win7 系统存在很多触摸问题,在应用启动过程还没有进入用户代码就触摸失效一般就是系统问题。如果在运行过程触摸失效了,也可能和系统相关但是大部分都是应用程序问题

为什么系统没有触摸失效而应用触摸失效了?从官方文档可以知道 windows 对触摸的处理方式,和从 打开 HID 集合Windows 触摸文档 可以知道,从硬件收到的消息需要进入 windows 内核处理,然后让处理之后的消息经过 Windows touch sdk 然后转发到应用,如下图

以上图片从windows 触摸架构文章复制

这是因为如果HID设备作为一个USB设备,如果被某个应用独占了,那么其他应用将无法访问这个USB设备。在 HID 设备中,默认都会被系统独占,那么被系统独占的 HID 设备是如何将数据发送到每个应用?此时就需要系统做转发了

但是在 win7 的时候,多指触摸还没有完善,很多古老的程序不知道有触摸消息,如果此时 Windows 直接发送触摸消息给到所有应用。那么可以看到有很多应用都是不工作的,于是小伙伴就会说垃圾微软,我的触摸屏无法使用。解决这样的问题很简单,只有在声明自己支持触摸的应用程序上,系统才会发送对应的触摸消息,如下文

Unless an application registers for Windows Touch input messages with the RegisterTouchWindow function, notifications for gestures (WM_GESTURE messages) are created by Windows and sent to that application window. If an application Window registers to receive touch messages, notifications for Windows Touch input (WM_TOUCH messages) are sent to that application window.

因为兼容的问题,有很古老的软件,例如 windows 的画图板,这部分软件以为自己是独占整个输入设备的,如 DirectInput 概述 里面相关博客提到的,那么这部分设备应该如何处理?系统将会在上层虚拟化出对应的设备,这些都是软件设备,让对应的应用独占,这样每个应用对独占的设备做了不清真的处理也不会影响其他程序

也就是从硬件的触摸到达应用需要经过系统,而应用程序是否真的有触摸,还需要系统给应用程序一个触摸设备或触摸信息。如果是上古的软件,系统将会给应用一个软件设备。如果是古老的软件,在没有声明支持触摸支持的时候,系统将不会发送触摸消息。如果是现代的软件声明 Pointer 的,那么将默认给触摸消息

应用的触摸失效很多都在于系统给应用分配触摸的时候,在应用程序启动的过程,如果和系统声明了自己是支持触摸的,但是系统访问驱动程序没有返回正确的触摸设备,或者系统这部分处理被魔改了,那么这个应用将触摸失效。如果系统认为这个应用是需要独占设备的,实际这个应用支持触摸,那么系统将会给这个应用设备列表,应用需要使用GetRawInputDeviceList自己手动监听,如果应用没有做,那么系统连触摸转鼠标都不会发给应用,这时的应用就会全触摸失效。而如果应用声明了自己支持触摸,系统没有处理,系统认为这是不支持触摸的应用,那么系统为了兼容就将触摸转鼠标给应用,此时应用将会多指触摸失效

是不是觉得上面的话很复杂?看看下面的图片方便你理解

如果是应用触摸失效,同时在启动的过程就触摸失效,那么可以做的方法是重启软件,重启软件将会重新告诉系统。此时系统可能返回对的值。如果系统很多次都没有给应用触摸,那么可能是系统的驱动没有安装对,或者系统的补丁没打对,或者系统是魔改的系统,此时可以尝试安装驱动,如果安装驱动没有用,那么尝试安装系统补丁或重装清真的系统

基本上应用触摸失效,同时在启动过程就触摸失效的,都是win7的系统,现在win10的触摸架构修改了,很少有用户告诉我触摸失效

那么如果是系统触摸失效了,如果是全失效,大部分都是硬件问题,测试方法是使用这个主机接到另一个市场上在卖的触摸设备,如果此时触摸可以用,但是接到自己做的触摸设备上无法使用触摸。那么就是自己的触摸设备没有做好,请阅读Windows 的 Pen 协议同时使用 BusHound 抓硬件发过来的数据,看是不是有哪些数据发的不符合文档

如果系统只是多指触摸失效了,那么也需要看一下是不是硬件问题,然后检查系统是否打上了驱动以及是否开启多指触摸支持

WPF 程序无法触摸操作?我们一起来找原因和解决方法! - walterlv

Resolve HID compliant touch screen missing

打开 HID 集合

Required HID Descriptors

winapi - How to determine display - touch device associations for windows 10? - Stack Overflow

RAWINPUT (winuser.h)

c++ - Associate HID Touch Device with Pnp Monitor - Stack Overflow

GetRawInputDeviceList function (winuser.h)

c - Too many raw input device from GetRawInputDeviceList() - Stack Overflow

winapi - GetRawInputDeviceList not working as expected on Windows7 - Stack Overflow

Windows 中支持的 HID 客户端 - Windows drivers

获取按用户模式应用程序的 HID 报表 - Windows drivers

HID 客户端驱动程序 - Windows drivers

键盘和鼠标 HID 客户端驱动程序 - Windows drivers

About Windows Touch - Windows applications

2019-11-29-WPF-客户端开发需要知道的触摸失效问题的更多相关文章

  1. 2019-9-18-WPF-客户端开发需要知道的触摸失效问题

    title author date CreateTime categories WPF 客户端开发需要知道的触摸失效问题 lindexi 2019-09-18 15:30:38 +0800 2019- ...

  2. 自适应界面开发总结——WPF客户端开发

    1.由于界面大小是变化的,所以必须有一个稳定不变的参考界面(即在一个标准的界面尺寸下进行WPF界面开发,比如:发票查验V3.0的美工设计尺寸——1024*740):   PS:在WPF的用户控件Xam ...

  3. pycharm+anaconda在Mac上的配置方法 2019.11.29

    内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...

  4. 2019.11.29 Mysql的数据操作

    为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...

  5. 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱

    今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1.    RZ10配置參數 a)       参数配置前,先导入激活版本 执行完毕后返回 b)      输入参数文件DEFAU ...

  6. Supervision meeting notes 2019/11/29

    topic 分支:  1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...

  7. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  8. 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)

    在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...

  9. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

随机推荐

  1. OC编码规范

    http://www.jianshu.com/p/8b76814b3663#class-constructor-methods

  2. java 反射基本认识

    java 反射基本认识 最近重新复习java反射的知识,有了新的理解. class类? 在面向对象中,万事万物皆对象.类也是个对象,是java.lang.class类的实例对象. public cla ...

  3. mybatis if-else用法

    demo: <select id="queryRuralCodes" resultType="string" parameterType="ma ...

  4. 5.如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?

    作者:中华石杉 面试题 如何基于 dubbo 进行服务治理.服务降级.失败重试以及超时重试? 面试官心理分析 服务治理,这个问题如果问你,其实就是看看你有没有服务治理的思想,因为这个是做过复杂微服务的 ...

  5. Django 简单的验证码

    创建一个 Django 项目:yanzhengma 和 应用 app01 修改 urls.py 文件 from django.contrib import admin from django.urls ...

  6. Centos7部署ejforum论坛(Java+tomcat+mysql)

    前面搭建Java环境和tomcat环境. 下面进行实战,搭建ejforum论坛 ejforum论坛源码:https://www.lanzous.com/i45rcoh Centos7安装MySQL数据 ...

  7. JS高阶---定时器相关

    首先看几个问题: [主体] (1)定时器真的时定时执行的吗? 顺序验证: 测试结果: 接下来对上述代码做下修改,增加一个长时间工作的消耗,此时再来验证下定时器运行的精准度 结果如下: (2)定时器回调 ...

  8. sql注入知识点

    需找sql注入点1\无特定目标inurl:.php?id= 2\有特定目标:inurl:.php?id= site:target.com 3\工具爬取spider,对搜索引擎和目标网站的链接进行爬取 ...

  9. Genymotion模拟器上money测试

    1.查看APK包名:sdk\build-tools\android-4.4W>aapt dump xmltree 123.apk AndroidManifest.xml 查看包名为:com.aa ...

  10. 使用表格 代替 txt文件(未完结)

    使用xlrd读取用户数据 首先创建一个xls文件 xlrd模块的简单使用 添加处理execl的接口: 使用excel生成测试报表