- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本文记录在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***消息?-腾讯云开发者社区-腾讯云 。
这个问题目前没有解决方案,但同一控件多设备混合输入场景比较少见,白板、批注等应用可能使用到,可以在触摸事件输入后判断上一次操作是否为鼠标事件,然后手动触发相应鼠标抬起事件的业务逻辑.
。
最后此篇关于WPF记录鼠标、触摸多设备混合输入场景问题的文章就讲到这里了,如果你想了解更多关于WPF记录鼠标、触摸多设备混合输入场景问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试为我的网站创建一个功能,允许用户使用 mousemove 和 touchmove 事件水平滚动 div 内容(类似于 Apple AppStore any app Screenshots s
我有固定的侧边栏导航栏,它在悬停时工作,但我想通过单击折叠按钮打开第一个菜单。类似于悬停在菜单 1 上的工作方式。我已经尝试了以下方法。 jsfiddle Demo $(document).on('c
Mouse.Synchronize() 在 .Net 中有什么作用? MSDN 说它“强制鼠标重新同步” 最佳答案 只是我的假设: Stylus 中存在类似的方法类别:Stylus.Synchroni
有没有什么办法可以同时使用鼠标, pygame.mouse.set_visible(False) 已激活。当前鼠标仅在尝试使用时返回右下坐标。需要在隐藏鼠标时能够获得正确的坐标。 在他们的 docum
我有一个缺少数据的数据库。我需要估算数据(我使用的是鼠标),然后根据原始列创建新列(使用估算数据)。我需要使用这些新列进行统计分析。 具体来说,我的参与者使用李克特 7 分量表填写了几份问卷。有些人没
我正在编写一个与电脑交互的机器人。简而言之,我所做的是: -截取屏幕截图- 在此屏幕截图上识别对象(使用 cv2 matchTemplate) -使用找到的位置进行一些鼠标操作(例如:将鼠标指针移动到
我的程序是一个文本游戏,它使用 WindowsForm 上的文本框模拟控制台输出。我试图实现的一个功能是通过单击一个按钮,它将以一定的速度输出到 TextBox,这是通过这种方法实现的 atm: pu
我遇到了一个问题。如果有任何帮助,我将不胜感激。 我正在尝试从玩家位置射击到鼠标点击位置。代码没有给我任何错误,根据我的逻辑,它应该可以工作,但它没有 它创建了项目符号对象,仅此而已。 //Bulle
给定一个带蓝牙的 Windows Mobile 6.1 智能手机,我想将它注册为鼠标。 基本上我现在做的: 使用 Guid {00001124-0000-1000-8000-00805f9b34fb}
我有一个关于在 JavaFX 中实现鼠标拖动事件的正确方法的问题。 我的 playGame() 方法当前使用 onMouseClicked,但这只是一个占位符 理想情况下,我希望“飞盘”沿着鼠标拖动的
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。我有点困惑的一件事是,当我将鼠标注册为 RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里
我想在我的网站浏览器窗口中 move 鼠标,如下所示:www.lmsify.com。我怎样才能做到这一点?(javascript、flash、activex) 问候,丽莎M 最佳答案 他们并没有真正
我想要一个动画。我是后端开发人员,但我必须使用 jquery 创建动画。 动画、背景和元素位置随鼠标移动而变化。 类似于http://www.kennedyandoswald.com/#!/premi
如何将鼠标“锁定”到某个 OpenGL 窗口。有点像在 Minecraft 中是如何完成的。GameDev 是一个更好的询问地点吗? 最佳答案 正如 Robert 在评论中所说,OpenGL 实际上并
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
如何使用 Java 和 JNA(Java native 访问)与 Windows API 交互?。我试图通过在鼠标输入流上排队鼠标事件来让鼠标做某事,并且代码有效,因为 SendInput(...)
我想用 C++ 脚本 move 鼠标光标。我在 Parallels 中的 Windows 7 中使用 Visual C++ 2010 Express,并创建了一个控制台应用程序。 我知道 SetCur
我有一些关于 WH_MOUSE 的问题。根据我的阅读,通过将钩子(Hook)放入 DLL 中,它会注入(inject)进程。这是否意味着捕获鼠标也适用于我的桌面、菜单启动等?那么应用程序的标题栏呢?我
如何为多只鼠标显示另一个光标? 我有两个 TMemos,两个可以输入各自 TMemo 的键盘,2 个鼠标,我需要 2 个光标。 如果假设的话,我已经可以检测出哪只鼠标是哪只了。我怎样才能让我自己的光标
我是一名优秀的程序员,十分优秀!