Const WM_MOUSEWHEEL = &H20A
Сообщение WM_MOUSEWHEEL посылается окну, имеющему фокус при прокрутке колесика мыши, через функцию обратного вызова WindowProc
Если приложение обработало это сообщение, то возвращается 0
' Перемещаем форму по экрану при помощи колесика мыши ' Поместите код в модуль, ' т.к. используется функция обратного вызова Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _ (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _ ByVal msg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Const GWL_WNDPROC = (-4) Public Const WM_MOUSEWHEEL = &H20A Dim PrevProc As Long
Public Sub HookForm(Button As Long) PrevProc = SetWindowLong(Button, GWL_WNDPROC, AddressOf WindowProc) End Sub
Public Sub UnHookForm(Button As Long) SetWindowLong Button, GWL_WNDPROC, PrevProc End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' Скроллируем форму. wParam - величина перемещения If uMsg = WM_MOUSEWHEEL Then Form1.scrollmove (wParam) End If WindowProc = CallWindowProc( _ PrevProc, hwnd, uMsg, wParam, lParam) End Function
' Поместите код для Form1 Private Sub Form_Load() HookForm Me.hwnd End Sub
Private Sub Form_Unload(Cancel As Integer) UnHookForm Me.hwnd End Sub
Public Sub scrollmove(wParam As Long) ' Ограничим перемещение формы до края экрана ' Также отслеживаем состояние формы. ' Если окно развернуто, то не двигаем форму If Me.WindowState = vbMaximized Then Exit Sub If wParam < 0 Then If Me.Top <= 60 Then Me.Top = 0 Exit Sub Else Me.Top = Me.Top - 200 End If Else If (Screen.Height - Me.Top) <= Me.Height Then Me.Top = Screen.Height - Me.Height Else Me.Top = Me.Top + 200 End If End If End Sub