以下是问题的简短摘要:
我将鼠标指针从控件 1 快速移动到控件 2。
在 IDE 中,顺序是这样的:
Control 1: Enter
Control 1: Leave
Control 2: Enter
Control 2: Leave
编译时,顺序是这样的(有时,但不总是):
Control 1: Enter
Control 2: Enter
Control 1: Leave
Control 2: Leave
以下是问题的完整描述:
我正在继承用户控件。
我处理 WM_MOUSEMOVE 和 WM_MOUSELEAVE。
当 WM_MOUSEMOVE 发生并且鼠标指针之前没有在控件上时,我将其检测为“Enter”。
然后我使用以下代码跟踪鼠标事件:
'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
当 WM_MOUSELEAVE 发生时,我知道鼠标指针已经离开了控件。
它完美地工作:很好。
当我在控件内移动鼠标指针时,会发生“Enter”事件。当我将鼠标移到控件外时,会出现“离开”输入。
现在我用非常快速的鼠标移动再次尝试相同的操作,我将鼠标指针快速移入和失控。它工作得很好,不管我做得多快。Enter-Leave-Enter-Leave 顺序非常好:Enter-Leave-Enter-Leave 等。
现在我复制控件,使它们中的两个彼此相邻:
我迅速将鼠标指针从控件 1 移动到控件 2。
顺序仍然很好:进入-离开-进入-离开。
现在我编译项目并运行 exe:
我也这样做:我将鼠标指针从控件 1 快速移动到控件 2。
现在发生以下顺序:
Control 1: Enter
Control 2: Enter
Control 1: Leave
Control 2: Leave
我认为序列是固定的,而不是像这里可以观察到的那样“可变”。
我没有想到什么?令我困惑的是,它在 IDE 中按预期工作,但在编译时无法预测。
为了调试正在发生的事情,我尝试了 Spy++,但它只报告 WM_MOUSEMOVE,所以我不知道我现在还能尝试什么来确定消息泵是否以“正确”的顺序接收它,并且由于某种原因,它只是在我的应用程序中搞砸了。
感谢您的任何帮助。