.net - 有没有办法设置鼠标必须在控件上方才能触发其 MouseHover 事件的时间段?
问题描述
我需要一种设置 MouseHoverTime 属性的方法,或者其他一些方法,以便在事件开始之前,鼠标需要在控件上停留一段给定的时间。
我有一组控件,当鼠标经过它们时需要执行代码,这可以通过 MouseEnter 或 MouseHover 来完成。但是,当鼠标快速通过其中许多控件时,每个控件的代码事件都会完全运行。这使得程序的运行变得痛苦且不切实际地缓慢。如果我可以为鼠标停留在控件上设置某个时间阈值,那么只有当鼠标停留在控件上时才会调用该事件,而不是在它短暂地经过它时调用。
Private Sub Tile_MouseHover(Sender As Object, e As EventArgs)
CODE
CODE
CODE
End Sub
该代码确实给出了预期的结果。它只是以蜗牛的速度提供它们,因为每次光标刷过一个控件时,它里面的所有代码都会被执行。
目标结果如下:
当光标悬停在控件上时,它必须在调用事件之前保持 1-2 秒。如果光标在此之前离开,则根本不会调用该事件。
解决方案
我在这里发布了答案的 C# 版本,并提供了更多详细信息。
注意:答案并未声称可以解决您在问题中分享的性能问题,但显示了如何增加鼠标悬停延迟时间。
悬停时间已设置NativeMethods.TRACKMOUSEEVENT
为 100 毫秒。
您可以通过将鼠标悬停所需的超时WM_MOUSEMOVE
设置为. 还可以处理和引发自定义事件,例如,然后您可以订阅事件。您可以在我的帖子中找到类似的方法来处理表单标题栏上的悬停事件:Handle Mouse Hover on Titlebar of Form。TrackMouseEvent
dwHoverTime
TRACKMOUSEEVENT
WM_MOUSEHOVER
MyMouseHover
MyMouseHover
VB.NET - 具有自定义悬停时间的悬停事件
MyMouseHover
她是一个以 500 毫秒延迟引发事件的控件示例:
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
推荐阅读
- google-chrome - Electron 如何确定自定义协议的来源
- highcharts - Highchart xAxis.currentDateIndicator 显示当前时间(经过)
- javascript - 可选地在 Vue 中导入组件
- javascript - 如何在 React.js 中的 api 中渲染和添加类似的项目到项目列表中?
- android - 无法通过应用程序连接到 Wifi
- ios - 从数组中获取特定索引
- adonis.js - Adonis migration:fresh 命令重新创建数据库和种子
- php - 使用 AJAX 无法在数据库中创建带有表单数据的 Laravel 8 文件上传
- python - 将多个数据框合并为一个
- c# - UWP ListView Selected Items 只返回一些项目