我创建了一个用户控件,并使用 Paul Catons 子类对其进行子类化。
WM_MOUSEMOVE 正在被解雇。
WM_MOUSELEAVE 不是。
为什么 WM_MOUSELEAVE 没有被解雇?
我已经看到人们在这样的 WM_MOUSEMOVE 事件中调用 TrackMouseEvent 以使 WM_MOUSELEAVE 触发的方法,但我不明白为什么需要强制执行它:
代码:
if uMsg = WM_MOUSEMOVE then
If Not m_bEntered Then
m_bEntered = True
Dim tme As TRACKMOUSEEVENT_STRUCT
With tme
.cbSize = Len(tme)
.dwFlags = TME_LEAVE
.hwndTrack = lng_hWnd
End With
Call TrackMouseEvent(tme)
但我不明白为什么应该这样做,为什么只在 WM_MOUSEMOVE 而不是在用户控件初始化时。
谢谢!
用户控件的代码是这样的:
代码:
Option Explicit
Private oSub As cSubclass 'cSubclass instance
Implements iSubclass
Private Sub UserControl_Initialize()
Set oSub = New cSubclass
oSub.Subclass UserControl.hwnd, Me
oSub.AddMsg UserControl.hwnd, WM_MOUSEMOVE, MSG_AFTER
oSub.AddMsg UserControl.hwnd, WM_MOUSELEAVE, MSG_AFTER
End Sub
Private Sub iSubclass_WndProc(ByVal bBefore As Boolean, bHandled As Boolean, lReturn As Long, ByVal lng_hWnd As Long, ByVal uMsg As WinSubHook2.eMsg, ByVal wParam As Long, ByVal lParam As Long, lParamUser As Long)
If uMsg = WM_MOUSELEAVE Then
Debug.Print Now & " wm_mouseleave" 'is not being fired
ElseIf uMsg = WM_MOUSEMOVE Then
Debug.Print Now & " wm_mousemove" 'is being fired
End If
End Sub