.net – 触摸WPF按钮有时不会调用Windows 8下的单击处理程序
“当应用程序窗口没有焦点时,有时按钮触摸不会调用点击处理程序.”
系统: 带有多点触控输入设备的Windows 8.1. 软件: 一个简单的WPF 4.5.2应用程序,只有一个按钮,可以记录是否调用了单击处理程序(只需创建一个新项目并添加一个带有单击处理程序的按钮到MainWindow). 现象: 通常,当触摸按钮时,会调用其单击处理程序.但是当应用程序窗口没有焦点时,有时单击处理程序不会在按钮触摸时调用(尽管按钮颜色变为蓝色).当应用程序窗口已经具有焦点时,触摸按钮始终有效. (在发布和调试模式下发生,无论是否附带调试器) 测试: 我查看了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()函数中. 我真的没有想法要检查什么. 更新: 我发现如果鼠标指针刚刚离开应用程序窗口(至少在我们的平台上),我也可以重现这种现象.并且随着用户界面的复杂性,错误发生的概率似乎也在增加 – 我的测试应用程序并不总是无法识别点击,但每次复杂的WPF应用都会失败. 您应该可以使用触摸设备在Windows 8.1上使用WPF开发人员工作室(例如,版本2013)重现它: >让开发人员工作室打开,只覆盖触摸屏的一半 解决方法
它已经证明是WPF中的BUG.在KB发布之前,有一种解决方法可用.
解决方法是调用Mouse.Synchronize();在受影响的MainWindow UIElement的PreviewTouchDown事件处理程序中. 我测试了它,它工作正常. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – v8_base.lib(作为node.js的一部分编译
- Signalr支持的平台
- windows-server-2003 – 运行我自己的专用服务器
- active-directory – 如何在Server 2012上删除孤
- wix:INSTALLDIR总是以斜线结尾吗?
- windows-phone-8 – 使用LongListSelector进行连
- windows-7 – 是否会重新启动W3SVC Web发布服务,
- 快速搭建windows服务器的可视化运维环境
- windows – 如何确定Win7被激活的密钥类型(零售或
- windows-services – 更改服务的启动类型(Window