Почему событие MouseMove постоянно запускается в немодальной форме даже при использовании стационарной мыши? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть форма Excel, в которой я использую событие перемещения мыши элементов управления для имитации эффекта зависания. Нет проблем, когда форма отображается модальной.

Когда я показываю форму немодальной, даже со стационарной мышью, событие mousemove каждого элемента управления запускается непрерывно (если мышь находится над этим элементом управления). Загрузка процессора возрастает до 26-30%.

Ничего не меняется, если событие перемещения мыши не имеет кода внутри. Если я прокомментирую все события, это странное поведение исчезнет.

Кажется, что простого существования события mouseMove достаточно, чтобы создать проблему.

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

1 Ответ

0 голосов
/ 05 февраля 2020

У меня есть относительно простое решение, которое должно справиться с проблемой использования процессора, но это ничего не делает против запуска событий, хотя мышь неподвижна. Идея состоит в том, чтобы использовать функцию sleep, предоставляемую API windows, для уменьшения частоты активации событий.

Итак, сначала вам нужно получить функцию:

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal lngMilliSeconds As Long)
#End If

и затем внутри вашей пользовательской формы:

Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    sleep 1  '1 should be the time in milliseconds that the code will wait, 
             'in practice it waits 15ms (see edit below)
    'insert the rest of your code here
End Sub

sleep 1 заставит код ждать одну миллисекунду, прежде чем возобновить выполнение. Редактировать: на практике код будет ждать 15 миллисекунд, см. Комментарий @GSergs к этому ответу.

Этого обычно достаточно, чтобы избавиться от проблемы использования процессора. Если вам не нужно, чтобы событие запускалось 65 раз в секунду, вы можете изменить частоту запуска, подождав дольше, например, с помощью sleep 30.

Если вам нужно, чтобы событие активировалось только один раз каждый раз, когда мышь Переход от «не к контролю» к «к контролю», решение заключается в использовании флага активации:

Внутри модуля Userforms:

Dim ControlActive As Boolean

Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Not ControlActive Then
        ControlActive = True
        'insert the rest of your code here
    End If
End Sub

Private Sub Userform_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If ControlActive Then
        ControlActive = False
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...