Как отловить скроллинг колесом мыши?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Nikita
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.02.2003 (Ср) 15:09
Откуда: Russia

Как отловить скроллинг колесом мыши?

Сообщение Nikita » 14.01.2004 (Ср) 13:35

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

Кстати, интересный факт, отлов сообщений через Spy++ - движения мыши типа WM_MOUSEMOVE ловятся, а кручение колеса мыши - их оно не видит! При этом список (если на нем фокус) нормально скроллится, появляются сообщения его перерисовки.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

---=< @ >=---

Сообщение Q2W » 05.02.2004 (Чт) 17:22

Хе хе. Я тоже хочу!!! Как я тебе помог, а?

angelina
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 13.11.2002 (Ср) 13:00

Сообщение angelina » 06.02.2004 (Пт) 10:49

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

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 06.02.2004 (Пт) 11:29

я бы скачал такой пример. не к спеху но вскором времени понадбиться.

Человек
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 02.01.2004 (Пт) 15:34
Откуда: Russia. Saint-Petersburg

ActiveX

Сообщение Человек » 06.02.2004 (Пт) 22:15

!!! Здесь не код нужен, а ActiveX контрол!!!
http://www.shnyr-ok.narod.ru/Mouse.zip
12kb
--<Более мощный компьютер глючит быстрее и точнее>--

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 06.02.2004 (Пт) 22:42

Поставь на форму таймер с интервалом в 1 и заполненный листбокс. Правда, тормозит жутко, но если подработать...
Код: Выделить всё
Const WM_MOUSEWHEEL = &H20A
Const Mouse_Scroll = &H780000
Private Type POINTAPI
X As Long
Y As Long
End Type

Private Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type

Dim mMsg As MSG
Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, _
ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long

Function GetNapr() As Long
Dim lMsg As Long
Dim Napr As Long
DoEvents
Call GetMessage(mMsg, Me.hwnd, 0, 0)
DoEvents
lMsg = mMsg.message
DoEvents
Napr = mMsg.wParam
DoEvents
If lMsg = 522 Then
DoEvents
If Napr = Mouse_Scroll Then
DoEvents
GetNapr = 1
DoEvents
ElseIf Napr = -Mouse_Scroll Then
DoEvents
GetNapr = -1
DoEvents
Else
DoEvents
GetNapr = 0
DoEvents
End If
DoEvents
End If
DoEvents
End Function

Private Sub Timer1_Timer()
Static a As Boolean
If a <> True Then GoTo 10
List1.ListIndex = 0
a = True
10 If GetNapr = 1 Then
DoEvents
If List1.ListIndex <= 0 Then Exit Sub
DoEvents
List1.ListIndex = List1.ListIndex - 1
DoEvents
ElseIf GetNapr = -1 Then
DoEvents
If List1.ListIndex = List1.ListCount - 1 Then Exit Sub
DoEvents
List1.ListIndex = List1.ListIndex + 1
Else
DoEvents
End If
DoEvents
End Sub
Нет меня больше

Vasya
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 23.04.2002 (Вт) 16:49
Откуда: Togo

Сообщение Vasya » 09.02.2004 (Пн) 7:23

А что, сабклассинг не помогает??

Tamahawk
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 03.02.2004 (Вт) 22:11

Сообщение Tamahawk » 09.02.2004 (Пн) 20:25

Человек.
!!! Здесь не код нужен, а ActiveX контрол!!!
http://www.shnyr-ok.narod.ru/Mouse.zip


У тя в mouse.OCX-е mouse.DEP-а нету

Tamahawk
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 03.02.2004 (Вт) 22:11

Сообщение Tamahawk » 09.02.2004 (Пн) 21:54

A.A.Z
я вижу у тя длинный и не очень эффективный код. :oops:

Никита используй глобальный хук, поставь на форму таймер (интервал можеш = 100)
и эта ерунда в модуле

Код: Выделить всё
Option Explicit
Public Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLongA Lib "user32" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4
Public Const WM_MOUSEWHEEL = &H20A
Public OldWindowProc As Long, Wheel As Integer
' wParam 7864320 Or 23592960 Or 15728640
Public Sub Hook(Hwnd As Long)
    OldWindowProc = SetWindowLongA(Hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
Public Function NewWindowProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_MOUSEWHEEL Then Wheel = IIf(wParam < 0, -1, 1)
    NewWindowProc = CallWindowProcA(OldWindowProc, Hwnd, Msg, wParam, lParam)
End Function


а эо в ж..
Код: Выделить всё
Option Explicit
Private Sub Form_Load()
    Call Hook(Me.Hwnd)
    tmrGet.Enabled = True
End Sub

Private Sub tmrGet_Timer()
Me.Caption = "Идет " & Wheel
End Sub


это все работает, тока без листа. там уж сам по трудись :idea:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 6

    TopList