如何解决编译时,WM_MOUSELEAVE 有时会在另一个控件上的 WM_MOUSEMOVE 之后发生
以下是问题的简短摘要:
我将鼠标指针从控件 1 快速移动到控件 2。
在IDE中,顺序是这样的:
nnoremap <C-s> :bel vert term<CR>
tnoremap <C-s> <CR>exit<CR>
编译时的顺序是这样的(有时,但不总是):
Control 1: Enter
Control 1: Leave
Control 2: Enter
Control 2: Leave
以下是问题的完整描述:
我正在对用户控件进行子类化。
我处理 WM_MOUSEMOVE 和 WM_MOUSELEAVE。
当 WM_MOUSEMOVE 发生时,并且鼠标指针之前没有在控件上,我检测到它为“Enter”。
然后我使用以下代码跟踪鼠标事件:
Control 1: Enter
Control 2: Enter
Control 1: Leave
Control 2: Leave
当 WM_MOUSELEAVE 发生时,我知道鼠标指针已经离开了控件。
效果很好:很好。
当我在控件内移动鼠标指针时,会发生“Enter”事件。 当我将鼠标移到控件外时,会发生“离开”输入。
现在我用非常快速的鼠标移动再次尝试相同的操作,我将鼠标指针快速移入和移出控制。无论我做得多快,它都能正常工作。 Enter-Leave-Enter-Leave 序列非常好:Enter-Leave-Enter-Leave 等
现在我复制控件,以便我有 2 个彼此相邻:
我将鼠标指针从控件 1 快速移动到控件 2。
顺序仍然很好:Enter-Leave-Enter-Leave。
现在我编译项目并运行exe:
我也这样做:我将鼠标指针从控件 1 快速移动到控件 2。
现在发生以下序列:
'Track the mouse leaving the indicated window
Private Sub TrackMouseLeave(ByVal lng_hWnd As Long)
Dim tme As TRACKMOUSEEVENT_STRUCT
With tme
.cbSize = Len(tme)
.dwFlags = TME_LEAVE
.hwndTrack = lng_hWnd
End With
Call TrackMouseEvent(tme)
End Sub
我认为序列是固定的,不像这里可以观察到的那样“可变”。
什么是我没有想到的? 令我感到困惑的是,它在 IDE 中按预期工作,但在编译时无法预测。
为了调试正在发生的事情,我尝试过 Spy++,但它只报告 WM_MOUSEMOVE,所以我不知道我现在还能尝试什么来确定消息泵是否以“正确”的顺序接收它,对于某些原因,它只是在我的应用程序中搞砸了。
感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。