WPF 记录鼠标、触摸多设备混合输入场景问题

news/2025/1/8 10:57:56/文章来源:https://www.cnblogs.com/kybs0/p/18642076

本文记录在WPF应用中鼠标、触摸混合输入,鼠标事件抬起时不会有MouseUp事件触发的问题。

事件输入我们都知道有3类:鼠标、触摸、触笔,鼠标是windows系统出来就有的事件,后面加了触笔、触摸。

1.鼠标输入,只会触发Mouse冒泡隧道事件;

2.触笔输入,会触发除了Stylus事件外,还会触发Mouse事件;

3.触摸输入,触发Touch事件、Stylus事件、Mouse事件。

如何区分三类事件可以参考 WPF 屏幕点击的设备类型 - 唐宋元明清2188 - 博客园,封装所有事件类型(包括Button阻止冒泡事件场景)整合成一个Device事件可以参考 WPF 设备输入事件封装 - 唐宋元明清2188 - 博客园

和小伙伴在定位PPT批注翻页问题时,发现在以WIN32跨进程设置父子窗口后再调动PPT上下翻页,批注触摸操作只会触发Mouse事件,但此Mouse事件只有Down没有Up,这类触摸只转鼠标的场景后面我单独描述下。当我尝试使用鼠标+触摸混合操作时,也能复现Mouse没有Up抬起事件。

鼠标+触摸,复现步骤:
1.鼠标按下

2.在其它位置触摸按下

3.鼠标抬起

4.触摸抬起

我们看看WPF真实反馈的事件输出,UI监听下面几个冒泡事件:

1     <Grid Background="LightGray"
2           MouseDown="UIElement_OnMouseDown" MouseUp="UIElement_OnMouseUp"
3           StylusDown="UIElement_OnStylusDown" StylusUp="UIElement_OnStylusUp"
4           TouchDown="UIElement_OnTouchDown" TouchUp="UIElement_OnTouchUp">
5     </Grid>

记录下输出事件,下面区分了鼠标、触摸、触笔:

 1     private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
 2     {
 3         if (e.StylusDevice != null) return;
 4         Debug.WriteLine("UIElement_OnMouseDown");
 5     }
 6     private void UIElement_OnMouseUp(object sender, MouseButtonEventArgs e)
 7     {
 8         if (e.StylusDevice != null) return;
 9         Debug.WriteLine("UIElement_OnMouseUp");
10     }
11 
12     private void UIElement_OnStylusDown(object sender, StylusDownEventArgs e)
13     {
14         if (e.StylusDevice.TabletDevice.Type != TabletDeviceType.Stylus)
15         {
16             return;
17         }
18         Debug.WriteLine("UIElement_OnStylusDown");
19     }
20     private void UIElement_OnStylusUp(object sender, StylusEventArgs e)
21     {
22         if (e.StylusDevice.TabletDevice.Type != TabletDeviceType.Stylus)
23         {
24             return;
25         }
26         Debug.WriteLine("UIElement_OnStylusUp");
27     }
28 
29     private void UIElement_OnTouchDown(object? sender, TouchEventArgs e)
30     {
31         Debug.WriteLine("UIElement_OnTouchDown");
32     }
33     private void UIElement_OnTouchUp(object? sender, TouchEventArgs e)
34     {
35         Debug.WriteLine("UIElement_OnTouchUp");
36     }

输出结果如下,鼠标+触摸混合操作时MouseUp事件被吞了

我们用Snoop抓事件列表,Grid层鼠标按下后就没有后续了:

有意思的是,鼠标重新按下抬起时,是有正常的MouseDown、MouseUp事件触发,所以只是之前那一次MouseUp未触发:

然后找了台Surface,使用鼠标+触笔按上面路径验证,也是有同样问题:

但是我发现使用触摸板+触笔,MouseUp事件正常触发了。。。 

所以这WPF框架问题,还区分鼠标、触摸板?我们看TouchPad设备的原理:标识输入设备 - Windows apps | Microsoft Learn、触控板交互 - Windows apps | Microsoft Learn,触摸板可以实现鼠标+多点触摸的功能,但单指操作时并不是鼠标或者触摸,如果要区分的话就需要通过其它其它途径。比如这篇文章有说相比正常的鼠标操作,触摸板返回鼠标消息时GetMessageExtraInfo()函数返回值是0: 如何区分触摸板和鼠标设备生成的WM_MOUSE***消息?-腾讯云开发者社区-腾讯云

这个问题目前没有解决方案,但同一控件多设备混合输入场景比较少见,白板、批注等应用可能使用到,可以在触摸事件输入后判断上一次操作是否为鼠标事件,然后手动触发相应鼠标抬起事件的业务逻辑。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861500.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Redis有序集合实现滑动窗口限流

滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数。通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化。 整个限流可以概括为两个主要步骤:统计窗口内的请求数量 应用限流规则Redis有序…

3、RabbitMQ队列之工作队列【RabbitMQ官方教程】

工作队列 使用 php-amqplib 在第一个教程中,我们编写了从命名队列发送和接收消息的程序。在本例中,我们将创建一个工作队列,用于在多个工作人员之间分配耗时的任务。 工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务,并必须等待其完成。相反,我们把…

静力学FEM12.30

1.静力学方程 考虑图所示变截面弹性杆的静态响应。这是线性应力分析或线弹性问题的一个例子,我们需要求杆内的应力分布σ(x)。 应力由物体的变形产生,而变形由物体内各点的位移u(x)表征。位移导致用ε(x)表示的应变;应变是一个无量纲变量。杆受到分布力b(x)或集中力作用。这…

软件工程个人总结作业

项目 详细信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 作业要求这个作业的目标 软工实践个人总结学号 102201233一、学期回顾 1.1 回顾你对于软件工程课程的想象 1.1.1 达到期待和目标的部分算法编写能力的提升目标:提高解决复杂算…

一袋米要抗几楼——软工学期回顾

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 对整个学期的学习进行总结学号 102201130🎓 一、学期回顾 1.1 回顾你对于软件工程课程的想象在上这门课之前,…

java.sql.SQLException: ORA-00600: 内部错误代码, 参数: [kcbnew_3]的其中一个解决方法

ORA-00600 解决方案java.sql.SQLException: ORA-00600: 内部错误代码, 参数: [kcbnew_3]的其中一个解决方法 重启 重启 重启 oracle服务。 今天反馈添加数据库报错 。试了一下就几各别的表不能插入。别的表好好的 GPT一下并检查了表空间都没什么问题。 执行 INSERT INTO DEVIC…

库卡机器人KR240电源模块维修思路讲解

一、库卡机器人KR240电源模块故障诊断 故障诊断是维修过程中的关键步骤。使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断。重点关注电源供应、输出电压、电流等关键参数。通过诊断结果,确定故障的具体位置和性质,为后续的维修工作提供明确方向。 二、…

【Airflow】入门笔记

前言 Airflow入门教程 正文 简介 任务管理、调度、监控工作流平台。 基于DAG(有向无环图)的任务管理系统。 基本架构组件scheduler: 以有向无环图(dag)的形式创建任务工作流,根据用户的配置将任务定时/定期进行调度 worker: 任务的执行单元,worker会从任务队列当中拉取任务…

[Airflow] 入门笔记

前言 Airflow入门教程 正文 简介 任务管理、调度、监控工作流平台。 基于DAG(有向无环图)的任务管理系统。 基本架构组件scheduler: 以有向无环图(dag)的形式创建任务工作流,根据用户的配置将任务定时/定期进行调度 worker: 任务的执行单元,worker会从任务队列当中拉取任务…

2024下学期加分项

软考中级设计师通过资格证书