1

以下是问题的简短摘要:

我将鼠标指针从控件 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,所以我不知道我现在还能尝试什么来确定消息泵是否以“正确”的顺序接收它,并且由于某种原因,它只是在我的应用程序中搞砸了。

感谢您的任何帮助。

4

0 回答 0