gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:18:26 39 4
gpt4 key购买 nike

“当应用程序窗口没有焦点时,有时按钮触摸时不会调用单击处理程序。”

系统:

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

软件:

一个简单的 WPF 4.5.2 应用程序,只有一个按钮,用于记录是否调用了单击处理程序(只需创建一个新项目并向主窗口添加一个带有单击处理程序的按钮)。

现象:

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

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

测试:

我检查了 Windows 中的各种触摸设置并进行了操作。我还重新校准了触摸 -> 没有区别。

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

当我查看收到的窗口消息(spy++)时,我得到以下消息(为了更好的概览而删除了 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 的 PromotionMainToMouse() 函数中。 StylusLogic。

我真的不知道该检查什么。因此,如果有人能给我建议还需要测试什么,或者在 .net 中设置断点以查找根本原因,那就太好了。或者更好地找到解决方案/解决方法。

更新:

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

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

  • 打开开发者工作室,仅覆盖触摸屏的一半
  • 移开移动,使光标指向桌面区域
  • 触摸按钮(例如“开始调试” - 播放按钮):在我的例子中,第一次触摸永远不会导致点击事件。

最佳答案

事实证明这是WPF中的一个BUG。在发布 KB 之前,有一个解决方法可用。

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

我测试了一下,效果很好。

关于.net - 在 Windows 8 下,触摸 WPF 按钮有时不会调用单击处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28441538/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com