title author date CreateTime categories
WPF 客户端开发需要知道的触摸失效问题
lindexi
2019-09-18 15:30:38 +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-9-18-WPF-客户端开发需要知道的触摸失效问题的更多相关文章

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

    原文:2019-11-29-WPF-客户端开发需要知道的触摸失效问题 title author date CreateTime categories WPF 客户端开发需要知道的触摸失效问题 lind ...

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

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

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

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

  4. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)

    时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...

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

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

  6. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示

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

  7. wpf 客户端【JDAgent桌面助手】业余开发的终于完工了。。晒晒截图

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

  8. wpf 客户端【JDAgent桌面助手】开发详解-开篇

    上周二 发表了一个帖子:wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图... 没有想到不到一个周时间已经浏览量过8千,估计过几天就过万了..很开心啊.. 评论中好多网友问我要 ...

  9. wpf 客户端【JDAgent桌面助手】开发详解(一)主窗口 圆形菜单

    目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图wpf 客户端[JDAgent桌面助手]开发详解-开篇 内容区域: 这里开始主窗口 圆形菜单制作的过程,首先请大家看 ...

随机推荐

  1. 利用TKinter模块创建GUI窗口

    # -*- coding: utf-8 -*- from Tkinter import *     root = Tk() # 80x80代表了初始化时主窗口的大小,0,0代表了初始化时窗口所在的位置 ...

  2. pytest的执行方式及搜索原则

    pytest的执行方式 Pytest/py.test(终端,命令行,pycharm可配置pytest方式执行) 1. Pytest –v (最高级别信息—verbose) 2. pytest -v - ...

  3. psql 命令

    (1)使用命令行连接数据库 psql -U postgres -h localhost -p 5433 (2)列出所有的数据库 \l -- 查看所有数据库 (3)进入某个数据库 \c name -- ...

  4. 读书笔记-----javascript基本数据类型

    由于js基础差, 记性也不好,准备一边读书一边做记录,希望这样能加深一下记忆 /*   第一天     */ javascript 基本数据类型 js一共只有五种数据类型 Undefined,  Nu ...

  5. sql server 事务隔离性 snapshot 、read committed说明

    一. --该 read committed 默认事务隔离级别 在 systemuser修改事务未完成时 select * from [SystemUser] where id=62; 该语句是不可读取 ...

  6. iOS开发系列-Block

    概述 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们可以定义一个指向函数的指针并且调用. #im ...

  7. Dubbo面试常见问题

    一.dubbo是什么? dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案.说白了其实dubbo就是一个远程调用的分布式框架. 二.dubbo的核心服务 ...

  8. 换了SSD发现plank也好了

    我的Dock用的是plank,很简单很好用.为什么不用Docky还有其他什么玩意儿呢?plank很简单很好用,资源占用很少,可以智能隐藏,you nearly can't feel it but yo ...

  9. 关于js中Ajax的同步、异步使用

    下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...

  10. Windows——关于Word2016/2019提示需要修复问题处理

    一.问题描述 打开Word提示 很抱歉此功能看似已中断,并需要修复.请使用Windows控制面板中的“程序和功能”选项修复Microsoft Office. 二.解决方法 运行 regedit 进入注 ...