Есть кое-что довольно хитрое, что вы могли бы сделать для этого, поэтому ниже вы можете найти отправную точку для вашего конкретного ответа.
Прямой ответ на вопрос
В верхней части вашего модуля вы заявляете, что Microsoft API получает координаты мыши:
Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Примечание. Если вы используете 32-разрядную систему, удалите ключевое слово PtrSafe
из объявления.
Кроме того, поверх модуля вы добавляете этот тип:
Type POINTAPI
Xcoord As Long
Ycoord As Long
End Type
Следовательно, внутри вашего макроса chkPrice_MouseMove
вы делаете что-то вроде этого:
- Когда сработает макрос, получите координаты мыши
- Очень скоро подождите, скажем, полсекунды
- Следовательно, снова получите координаты мыши. Если они совпадают с предыдущими, это означает, что пользователь удерживает мышь в той же точке, чтобы вы могли вызвать событие.
В коде:
Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI
GetCursorPos llCoordBefore '<-- get first time
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+0.5)
GetCursorPos llCoordAfter '<-- get second time
If llCoordBefore.Xcoord = llCoordAfter.Xcoord And llCordBefore.Ycoord = llCoordAfter.Ycoord Then '<-- compare
With sht
If .lblTooltip.Visible = False Then
.lblTooltip.Visible = True
ElseIf .lblTooltip.Visible = True Then
.lblTooltip.Visible = False
End If
End With
End If
Почему бы мне не использовать это
Я думаю, что ваш лучший шанс - поместить элемент управления ActiveX в место, где пользователь не будет зависать по ошибке.
Ваш код при наведении курсора мыши говорит, что:
1) Если подсказка не видна, то сделайте ее видимой
2) Если подсказка видна, то скрыть ее
Если пользователь быстро передает элемент управления, а всплывающая подсказка скрыта, ожидается, что он появится и не будет скрыт. Пользователь должен вернуть элемент управления, чтобы снова его скрыть.
В любом случае, вот несколько причин, по которым вышеупомянутый метод, о котором вы думали, не является моей рекомендацией:
- Приложение будет ждать X секунд. Если пользователь зависнет по ошибке, он получит свой Excel, ожидающий X секунд, прежде чем он сможет снова получить контроль. Это может раздражать с точки зрения UX.
- API получает координаты очень чувствительным образом. Вам нужно будет реализовать приближение (в моем примере, я продолжаю, только если координаты одинаковы до и после наведения; однако в реальной жизни вам нужно будет оставить некоторое поле, потому что мышь может немного перемещаться между первое и второе получают координаты).