Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как узнать направление скролла мышки вне формы Добавлено: 09.02.10 22:27  

Автор вопроса:  Just
vb6
xp

Ставлю хук системы (с помощью SetWindowsHookEx)и отлавливаю сообщение WM_MOUSEWHEEL, но вот направление скролла удается получать только с хука формы (с помощью CallWindowProcA)

Как установить хук на всю систему и при этом получать направление скролла?

Кто может помочь - откликнитесь!
Заранее спасибо!

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #1 Добавлено: 10.02.10 15:22
написать dll.

Ответить

Номер ответа: 2
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #2 Добавлено: 10.02.10 16:06
а конкретней не знаешь случаем как это сделать?
я создавал класс, но подозреваю что dll делать это уже по части оптимизации кода...

Ответить

Номер ответа: 3
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #3 Добавлено: 10.02.10 16:43
нужно написать dll (можно на C++) - только так можно установить глобальный хук... может в vb6 есть какие-то другие методы, но я не знаю. могу только на C# помочь =)

Ответить

Номер ответа: 4
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #4 Добавлено: 10.02.10 17:05
скорей всего ты прав! наверное поэтому я нашел упоминание о глобальном хуке и направления скролла только на си )))

как я понял раз нужен си - значит нада лезть уже в ядро системы...

SSTREGG можешь помочь с dll'ой?

Ответить

Номер ответа: 5
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #5 Добавлено: 10.02.10 17:10
в ядро системы лезть не надо ) на C++ я не напишу, тока на C# (а это .NET). Если надо отлавливать только WM_MOUSEWHEEL, то могу написать на C# и экспортировать функцию (чтобы можно было использовать на VB6)

Ответить

Номер ответа: 6
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #6 Добавлено: 10.02.10 17:19
движение скролла я могу отловить (и по всей системе и в отдельной проге), а вот направление... с этим проблемка есть... )

SSTREGG спасибо большое! но с этим у меня пока проблем нет )

Ответить

Номер ответа: 7
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #7 Добавлено: 10.02.10 17:39
пока я для получения направления сколла использую сл код:

(если у кого есть мысли как по другому получить направление скролла в системе - пишите)

  1.  
  2. 'в форму
  3. Option Explicit
  4.  
  5. Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As KeyCodeConstants) As Integer
  6. Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
  7.  
  8.  
  9. Private Sub Form_Load()
  10. Me.BorderStyle = 0
  11. Me.Top = -5000
  12. Call HookMouseWheel(Me.hWnd)
  13. End Sub
  14.  
  15. Private Sub Form_Unload(Cancel As Integer)
  16. Call UnHookMouseWheel(Me.hWnd)
  17. End Sub
  18.  
  19. Private Sub Timer1_Timer()
  20. On Error Resume Next
  21. If GetKeyState(vbKeyMButton) Then
  22.   Form1.Show
  23.   ShowWindow Form1.hWnd, 1
  24.   AppActivate ("Form1")
  25.   SendKeys "~"
  26. End If
  27. End Sub
  28.  
  29. Private Sub Timer2_Timer()
  30. On Error Resume Next
  31. If Wheel <> 0 Then
  32.     If Wheel = 1 Then MsgBox "1"
  33.     If Wheel = -1 Then MsgBox "-1"
  34.     Wheel = 0
  35. End If
  36. End Sub



  1.  
  2. 'в модуль
  3. Option Explicit
  4. Private 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
  5. Private Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  6. Private Const GWL_WNDPROC = -4
  7. Private Const WM_MOUSEWHEEL = &H20A
  8. Private lpPrevWndProc As Long
  9. Public Wheel As Integer
  10.  
  11. Sub HookMouseWheel(hWnd As Long)
  12. lpPrevWndProc = SetWindowLongA(hWnd, GWL_WNDPROC, AddressOf WindowProc)
  13. End Sub
  14.  
  15. Sub UnHookMouseWheel(hWnd As Long)
  16. Call SetWindowLongA(hWnd, GWL_WNDPROC, lpPrevWndProc)
  17. End Sub
  18.  
  19. Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  20. On Error Resume Next
  21. If uMsg = WM_MOUSEWHEEL Then
  22. If wParam = -7864320 Or wParam = -23592960 Or wParam = -15728640 Then Wheel = -1
  23. If wParam = 7864320 Or wParam = 23592960 Or wParam = 15728640 Then Wheel = 1
  24. Else
  25. WindowProc = CallWindowProcA(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
  26. End If
  27. End Function



p.s. конечно изврат устанавливать фокус на окно каждый раз при использовании колесика мышки... но пока лучше не нашел способа

Ответить

Номер ответа: 8
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #8 Добавлено: 10.02.10 18:06
т.е. направление скролла? вверх или вниз, или что-то другое?

Ответить

Номер ответа: 9
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #9 Добавлено: 10.02.10 18:22
да. вверх или вниз.

есть еще альтернатива делать хук на всю сисетму и отловив сообщение WM_MOUSEWHEEL (движение скролла) активизировать свою прогу ))

нашел по поводу скролла в си, может кого на мысль наведет (у меня уже нет мыслей)
const int WM_VSCROLL = 0x0115;
const int WM_HSCROLL = 0x0114;

MSH_MOUSEWHEEL
zDelta = (int) wParam; // wheel rotation
xPos = LOWORD(lParam); // horizontal position of pointer
yPos = HIWORD(lParam); // vertical position of pointer

Ответить

Номер ответа: 10
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #10 Добавлено: 10.02.10 18:26
WM_VSCROLL и WM_HSCROLL это не те сообщения, посмотри в MSDN. Ты же вроде определяешь скролл (7 пост): -1 = вниз; 1 = вверх.

p.s. MSH_MOUSEWHEEL - это вроде для Win95.

Ответить

Номер ответа: 11
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #11 Добавлено: 10.02.10 18:40
WM_VSCROLL, WM_HSCROLL - это что скроллы формы? ))

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

вот я и ищу способ желательно из vb (без dll) получить направление колесика мышки из любого окна (по всей системе)

Ответить

Номер ответа: 12
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #12 Добавлено: 10.02.10 18:52
без dll глобальный хук не поставить.

Ответить

Номер ответа: 13
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #13 Добавлено: 10.02.10 19:00
все к тому и сводится... но есть одно но!
без dll я могу же отлавливать по всей систему WM_MOUSEWHEEL и тд

в любом случае спасибо за помощь!
буду искать тогда dll или дальше щелкать по колесику шоб отловить направление ))

если у кого есть мысли или что еще лучше исходник ))) - пишите!

Ответить

Номер ответа: 14
Автор ответа:
 SSTREGG



Вопросов: 3
Ответов: 64
 Профиль | | #14 Добавлено: 10.02.10 19:06
Just пишет:
без dll я могу же отлавливать по всей систему WM_MOUSEWHEEL и тд

ага, через ж*пу =)

Ответить

Номер ответа: 15
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #15
Добавлено: 10.02.10 21:03
Что значит не поставить глобальный хук без dll. Я для плеера написал дополнительную прогу, которая ловит WM_MOUSEWHEEL и отправляет плееру сообщения.
Ты делай лоулевел хук.
  1. Private Const WH_MOUSE_LL As Long = 14
  2. mou_hook_hndl = SetWindowsHookEx(WH_MOUSE_LL, AddressOf km_hook_proc, App.hInstance, 0)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам