加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 触摸WPF按钮有时不会调用Windows 8下的单击处理程序

发布时间:2020-12-14 02:21:03 所属栏目:Windows 来源:网络整理
导读:“当应用程序窗口没有焦点时,有时按钮触摸不会调用点击处理程序.” 系统: 带有多点触控输入设备的Windows 8.1. 软件: 一个简单的WPF 4.5.2应用程序,只有一个按钮,可以记录是否调用了单击处理程序(只需创建一个新项目并添加一个带有单击处理程序的按钮到Mai
“当应用程序窗口没有焦点时,有时按钮触摸不会调用点击处理程序.”

系统:

带有多点触控输入设备的Windows 8.1.

软件:

一个简单的WPF 4.5.2应用程序,只有一个按钮,可以记录是否调用了单击处理程序(只需创建一个新项目并添加一个带有单击处理程序的按钮到MainWindow).

现象:

通常,当触摸按钮时,会调用其单击处理程序.但是当应用程序窗口没有焦点时,有时单击处理程序不会在按钮触摸时调用(尽管按钮颜色变为蓝色).当应用程序窗口已经具有焦点时,触摸按钮始终有效.
这种情况有时只会发生在具有不同触摸硬件的各种系统上(所有Windows 8.1).我从未在Windows 7上体验过它.
无论窗口是否聚焦,使用鼠标都能正常工作.

(在发布和调试模式下发生,无论是否附带调试器)

测试:

我查看了Windows中的各种触摸设置并使用它进行了播放.我也重新校准触摸 – >没有不同.

当检查WPF按钮鼠标并触摸事件时,在错误情况下,最后收到的事件是PreviewMouseUp但没有Click!

当我查看收到的窗口消息(间谍)时,我得到以下内容(WM_IME_SETCONTEXT,WM_GETTEXT,WM_NCHITTEST,WM_GETOBJECT被删除以获得更好的概述):

收到点击:

R WM_POINTERACTIVATE pmsd->lResult:FFFFFFFFFFFFFFFF
S WM_MOUSEACTIVATE hwndTopLevel:000503F8 nHittest:HTCLIENT uMsg:WM_POINTERDOWN
R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S WM_WINDOWPOSCHANGING lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGING
S WM_WINDOWPOSCHANGED lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGED
S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
R WM_ACTIVATEAPP
S WM_NCACTIVATE fActive:True
R WM_NCACTIVATE
S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
R WM_IME_NOTIFY
S WM_SETFOCUS hwndLoseFocus:(null)
R WM_SETFOCUS
R WM_ACTIVATE
S message:0x02CC [Unknown] wParam:00000000 lParam:00C50BA8
R message:0x02CC [Unknown] lResult:00000100
P WM_POINTERENTER wPointerID:0099 wFlags:6017
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:145 yPos:62
R WM_POINTERCAPTURECHANGED
P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:145 yPos:62
P WM_POINTERLEAVE wPointerID:0099 wFlags:6000
P WM_LBUTTONUP fwKeys:0000 xPos:145 yPos:62
P WM_MOUSEMOVE fwKeys:0000 xPos:145 yPos:62
S WM_CAPTURECHANGED hwndNewCapture:000503F8
R WM_CAPTURECHANGED
S WM_CAPTURECHANGED hwndNewCapture:00000000
R WM_CAPTURECHANGED
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:145 yPos:62

点击未收到

S message:0x02CC [Unknown] wParam:00000000 lParam:00AE0BA9
R message:0x02CC [Unknown] lResult:00000100
R WM_POINTERACTIVATE pmsd->lResult:FFFFFFFFFFFFFFFF
S WM_MOUSEACTIVATE hwndTopLevel:000503F8 nHittest:HTCLIENT uMsg:WM_POINTERDOWN
R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S WM_WINDOWPOSCHANGING lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGING
S WM_WINDOWPOSCHANGED lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGED
S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
R WM_ACTIVATEAPP
S WM_NCACTIVATE fActive:True
R WM_NCACTIVATE
S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
R WM_IME_NOTIFY
S WM_SETFOCUS hwndLoseFocus:(null)
R WM_SETFOCUS
R WM_ACTIVATE
P WM_POINTERENTER wPointerID:0090 wFlags:6017
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:147 yPos:39
R WM_POINTERCAPTURECHANGED
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:147 yPos:39
P WM_POINTERLEAVE wPointerID:0090 wFlags:6000
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONUP fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39

在错误中还有其他行

S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP
R WM_SETCURSOR fHaltProcessing:False

在WM_LBUTTONUP之前.但我不知道这件事.

我已经尝试调试.net代码以查看哪个条件导致不调用Click处理程序但我很快就迷失在System.Windows.Input.InputManager和System.Windows.Input.StylusLogic的PromoteMainToMouse()函数中.

我真的没有想法要检查什么.
因此,如果有人可以给我建议还有什么可以测试或者在.net中设置断点以查找根本原因,那将会很棒.或者甚至更好地找到解决方案/解决方法.

更新:

我发现如果鼠标指针刚刚离开应用程序窗口(至少在我们的平台上),我也可以重现这种现象.并且随着用户界面的复杂性,错误发生的概率似乎也在增加 – 我的测试应用程序并不总是无法识别点击,但每次复杂的WPF应用都会失败.

您应该可以使用触摸设备在Windows 8.1上使用WPF开发人员工作室(例如,版本2013)重现它:

>让开发人员工作室打开,只覆盖触摸屏的一半
>移开移动,使光标指向桌面区域
>触摸按钮(例如“开始调试” – 播放按钮):在我的情况下,第一次触摸不会导致点击事件.

解决方法

它已经证明是WPF中的BUG.在KB发布之前,有一种解决方法可用.

解决方法是调用Mouse.Synchronize();在受影响的MainWindow UIElement的PreviewTouchDown事件处理程序中.

我测试了它,它工作正常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读