Есть ли способ установить период времени, в течение которого мышь должна находиться над элементом управления, чтобы вызвать событие MouseHover? - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужен способ установить свойство MouseHoverTime или другой способ сделать его таким, чтобы мышь находилась над элементом управления в течение заданного промежутка времени, прежде чем событие наступит.

У меня естьнабор элементов управления, которые должны выполнять код при наведении мыши на них, что можно сделать с помощью MouseEnter или MouseHover.Однако, когда мышь быстро проходит по многим из этих элементов управления, событие кода для каждого элемента управления запускается полностью.Это делает выполнение программы мучительно и непрактично медленным.Если бы я мог установить определенный временной интервал для мыши, чтобы он оставался над элементом управления, то событие вызывалось бы только тогда, когда мышь остается над элементом управления, а не когда оно кратковременно проходит над ним.

Private Sub Tile_MouseHover(Sender As Object, e As EventArgs)

CODE
CODE
CODE

End Sub

Код действительно дает ожидаемые результаты.Он просто дает им улитку, потому что каждый раз, когда курсор чистит элемент управления, весь код внутри него выполняется.

Целевые результаты будут следующими:

Когда курсор находится над элементом управления, он должен оставаться там в течение 1-2 секунд, прежде чем вызвать событие.Если курсор перед этим уходит, событие вообще не вызывается.

1 Ответ

0 голосов
/ 07 февраля 2019

Я разместил версию ответа на C # здесь с чуть более подробной информацией.


Примечание: Ответ не претендует на решение проблемы с производительностью, которой вы поделились в этом вопросе, но показывает, как можно увеличить время задержки при наведении мыши.

Время наведения было установлено в NativeMethods.TRACKMOUSEEVENT до 100 миллисекунд.

Вы можете обрабатывать WM_MOUSEMOVE и вызывать 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
...