我需要一种方法来设置MouseHoverTime属性,或者通过其他方法来设置它,以便在事件开始之前,鼠标需要悬停控件一定的时间。
我有一组控件,当鼠标移到它们上时需要执行代码,可以使用MouseEnter或MouseHover来完成。但是,当鼠标快速经过这些控件中的许多控件时,每个控件的代码事件将全部运行。这使程序的运行痛苦而又不切实际地缓慢。如果我可以为鼠标停留在控件上设置一个特定的时间阈值,那么仅当鼠标停留在控件上时才调用该事件,而当鼠标短暂停留在控件上时才调用该事件。
Private Sub Tile_MouseHover(Sender As Object, e As EventArgs)
CODE
CODE
CODE
End Sub
代码确实给出了预期的结果。这只是让他们步履蹒跚,因为每次光标像刷一个控件一样多时,其中的所有代码都会被执行。
目标结果如下:
当光标悬停在控件上时,它必须在该控件上停留1-2秒,然后再调用该事件。 如果光标在此之前离开,则根本不会调用该事件。
答案 0 :(得分:4)
我发布了答案here的C#版本,其中包含更多详细信息。
注意:答案并不能解决性能问题, 您分享了该问题,但说明了如何增加鼠标 悬停延迟时间。
悬停时间已在NativeMethods.TRACKMOUSEEVENT
中设置为100毫秒。
您可以通过将鼠标悬停的期望超时设置为TrackMouseEvent
的WM_MOUSEMOVE
字段来处理dwHoverTime
并调用TRACKMOUSEEVENT
。同时处理WM_MOUSEHOVER
并引发一个自定义事件,例如MyMouseHover
,然后您可以订阅MyMouseHover
事件。您可以在我的帖子中找到类似的方法来处理表单标题栏上的悬停事件:Handle Mouse Hover on Titlebar of Form。
VB.NET-具有自定义悬停时间的悬停事件
她是一个控件的示例,该控件以500毫秒的延迟引发MyMouseHover
事件:
Imports System
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Public Class SampleControl
Inherits Control
<DllImport("user32.dll")>
Private Shared Function TrackMouseEvent(ByRef lpEventTrack As TRACK_MOUSE_EVENT) _
As Integer
End Function
<StructLayout(LayoutKind.Sequential)>
Private Structure TRACK_MOUSE_EVENT
Public cbSize As UInteger
Public dwFlags As UInteger
Public hwndTrack As IntPtr
Public dwHoverTime As UInteger
Public Shared ReadOnly Empty As TRACK_MOUSE_EVENT
End Structure
Private track As TRACK_MOUSE_EVENT = TRACK_MOUSE_EVENT.Empty
Const WM_MOUSEMOVE As Integer = &H200
Const WM_MOUSEHOVER As Integer = &H2A1
Const TME_HOVER As Integer = &H1
Const TME_LEAVE As Integer = &H2
Public Event MyMouseHover As EventHandler
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_MOUSEMOVE Then
track.hwndTrack = Me.Handle
track.cbSize = CUInt(Marshal.SizeOf(track))
track.dwFlags = TME_HOVER Or TME_LEAVE
track.dwHoverTime = 500
TrackMouseEvent(track)
End If
If m.Msg = WM_MOUSEHOVER Then
RaiseEvent MyMouseHover(Me, EventArgs.Empty)
End If
MyBase.WndProc(m)
End Sub
End Class