原文: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. ANDROID培训准备资料之项目结构简单介绍

    Android Studio项目结构初步主要介绍下面几个文件夹,后续再补充 (1)java文件夹的介绍 (2)Res文件夹的介绍 (3)R文件的介绍 (4)Manifests文件夹的介绍 我们先看看整 ...

  2. springcloud学习之路: (一) 最简单的搭建springcloud的方法

    参考资料: [JavaEE] 五分钟搭建SpringCloud环境, 进入微服务时代 感谢上篇博文大佬带领走进springcloud世界, 本博文主要目的为记录自己学习springcloud的点点滴滴 ...

  3. Codeforces Round #304 (Div. 2)(CF546E) Soldier and Traveling(最大流)

    题意 给定 n 个城市,m 条边.人只能从走相邻边相连(只能走一次)的城市. 现在给你初始城市的每一个人数,再给一组每个城市人数.询问是否可以从当前人数变换到给定人数.如果能,输入"YES& ...

  4. Spring管理连接池实验出现错误(c3p0)

    配置文件: 测试文件: 出现异常报错:

  5. fitEllipse的外接矩形与拟合的椭圆参数关系

    根据我看的博客,fitEllipse返回的外接矩形(假设为box),对应椭圆的相应参数: box.size.width 和box.size.height对应椭圆的长轴和短轴: box.center对应 ...

  6. 201871010101-陈来弟《面向对象程序设计(java)》第七周学习总结

    201871010101-陈来弟<面向对象程序设计(java)>第七周学习总结 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/n ...

  7. Nginx配置参数中文详细说明

    #定义Nginx运行的用户和用户组user www www;##nginx进程数,建议设置为等于CPU总核心数.worker_processes 8;##全局错误日志定义类型,[ debug | in ...

  8. thymeleaf关于js的一些坑

    乍一看,没问题,也许对应用过thymeleaf的小伙伴来说一眼就看出了问题,但是对于新手确实很难发现,thymeleaf会把[[]]中的内容作为内联取值块解析,而不是数组. 解决办法 方法一: < ...

  9. 洛谷 P2357 守墓人

    洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...

  10. leetcode2. 两数相加

    使用迭代的方式 class Solution{ public: ListNode *addTwoNumbers(ListNode* l1,ListNode *l2) { ListNode *res=) ...