Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

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

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

Ответить

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

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



Вопросов: 4
Ответов: 330
 Профиль | | #16 Добавлено: 10.02.10 23:03
Ты делай лоулевел хук.

а что мне это даст?

я пробывал так: (без dll, в классе)

hJournalHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf JournalRecordProc, App.hInstance, 0)

а дальше уже получал сообщение WM_MOUSEWHEEL
т.е. я получал что скролл двигается а направление нет

а WH_MOUSE_LL тот же WM_MOUSEWHEEL только на более ранней стадии когда еще можно перехватить и отменить сообщение

если я не прав то поправте плиз

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #17
Добавлено: 10.02.10 23:57
И поправлю ведь. WH_MOUSE_LL (вместо WH_JOURNALRECORD) - глобальный хук мыши, а WM_MOUSEWHEEL - это сообщение приходящее в процедуру обработки.

Вот весь модуль. Тебе нужны функции hook и unhook
  1. '    Copyright 2009, 2010 Makarov Andrey
  2. '
  3. '    This file is part of hooktool (Audica service program).
  4. '
  5. '    Audica is free software: you can redistribute it and/or modify
  6. '    it under the terms of the GNU General Public License as published by
  7. '    the Free Software Foundation, either version 3 of the License, or
  8. '    (at your option) any later version.
  9. '
  10. '    Audica is distributed in the hope that it will be useful,
  11. '    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. '    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. '    GNU General Public License for more details.
  14. '
  15. '    You should have received a copy of the GNU General Public License
  16. '    along with Audica.  If not, see <http://www.gnu.org/licenses/>.
  17.  
  18. Option Explicit
  19. Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  20. 'Private Const WM_COPYDATA As Long = &H4A
  21. Private Const WM_USER As Long = &H400
  22. Private Const WM_WHEEL As Long = (WM_USER + 1)
  23. Private Const WM_KEYS As Long = (WM_USER + 2)
  24. Private Const WM_REGHOOK As Long = (WM_USER + 3)
  25. Private Const WM_UNREGHOOK As Long = WM_REGHOOK
  26. Private Const WM_RESTART As Long = (WM_USER + 4)
  27.  
  28. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  29. Private Const WINDOW_NAME As String = "Audica_Dummy"
  30. Private Const HOOK_NAME As String = "HookTool_Dummy"
  31. Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  32. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  33. Private Const GWL_WNDPROC As Long = -4
  34. Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hmenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
  35. Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
  36. Private wnd As Long, dummy As Long
  37.  
  38. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  39. Public Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  40. Public Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long
  41. Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  42. Private Const HC_ACTION = 0
  43. Private Const WM_KEYDOWN = &H100
  44. Private Const WM_KEYUP = &H101
  45. Private Const WM_SYSKEYDOWN = &H104
  46. Private Const WM_SYSKEYUP = &H105
  47. Private Const WH_KEYBOARD_LL = 13
  48. Private Const WM_MOUSEWHEEL = &H20A
  49. Private Const WH_MOUSE_LL As Long = 14
  50. Private Type KBDLLHOOKSTRUCT
  51.     vkCode As Long
  52.     scanCode As Long
  53.     Flags As Long
  54.     time As Long
  55.     dwExtraInfo As Long
  56. End Type
  57. Private p As KBDLLHOOKSTRUCT
  58. Private mou_rotat As Integer
  59. Private kbd_hook_hndl As Long
  60. Private mou_hook_hndl As Long
  61. Public kbd_keys As New Collection 'Коллекция нажатых клавиш
  62.  
  63. Public Sub hook()
  64.     kbd_hook_hndl = _
  65.         SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf km_hook_proc, App.hInstance, 0)
  66.     mou_hook_hndl = _
  67.         SetWindowsHookEx(WH_MOUSE_LL, AddressOf km_hook_proc, App.hInstance, 0)
  68. End Sub
  69.  
  70. Public Sub unhook()
  71.     If kbd_hook_hndl <> 0 Then _
  72.         UnhookWindowsHookEx kbd_hook_hndl
  73.     kbd_hook_hndl = 0
  74.     If mou_hook_hndl <> 0 Then _
  75.         UnhookWindowsHookEx mou_hook_hndl
  76.     mou_hook_hndl = 0
  77. End Sub
  78.  
  79. Public Function km_hook_proc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  80.     If nCode = HC_ACTION Then
  81.         Select Case wParam
  82.         Case WM_MOUSEWHEEL
  83.             CopyMemory mou_rotat, ByVal lParam + 10, 2
  84.             PostMessage wnd, WM_WHEEL, App.hInstance, CLng(Sgn(mou_rotat))
  85.         Case WM_KEYDOWN, WM_SYSKEYDOWN
  86.             CopyMemory p, ByVal lParam, Len(p)
  87.             If valByKey(p.vkCode) = -1 Then
  88.                 kbd_keys.Add p.vkCode, CStr(p.vkCode)
  89.                 If kbd_keys.Count = 1 Then _
  90.                     PostMessage wnd, WM_KEYS, App.hInstance, 1
  91.             End If
  92.         Case WM_KEYUP, WM_SYSKEYUP
  93.             CopyMemory p, ByVal lParam, Len(p)
  94.             If valByKey(p.vkCode) <> -1 Then _
  95.                 kbd_keys.Remove CStr(p.vkCode)
  96.             If kbd_keys.Count = 0 Then _
  97.                 PostMessage wnd, WM_KEYS, App.hInstance, -1
  98.         End Select
  99.     End If
  100.     km_hook_proc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
  101. End Function
  102.  
  103. Private Function valByKey(ByVal key As String) As Long
  104. On Error GoTo 1:
  105.     valByKey = kbd_keys.Item(key)
  106. Exit Function
  107. 1:  valByKey = -1
  108. End Function
  109.  
  110. Private Function int_WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  111.     If uMsg = WM_UNREGHOOK Then Unload Form1
  112.     int_WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
  113. End Function
  114.  
  115. 'Найти сервер, создать дамми-окно, зарегистрировать его на сервере
  116. Public Function findServer() As Boolean
  117.     Dim prev As Long
  118.     If b(prev, FindWindow(vbNullString, HOOK_NAME)) Then _
  119.         PostMessage prev, WM_UNREGHOOK, 0, 0    'Выключить запущенный hooktool
  120.     If b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then
  121.         If dummy = 0 Then
  122.             dummy = CreateWindowEx(0, "STATIC", HOOK_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
  123.             SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
  124.         End If
  125.         PostMessage wnd, WM_REGHOOK, App.hInstance, dummy
  126.         findServer = True
  127.     End If
  128. End Function
  129.  
  130. Public Sub destroyDummy()
  131.     If dummy Then _
  132.         DestroyWindow dummy
  133. End Sub
  134.  
  135. Private Function b(p1 As Long, p2 As Long) As Boolean
  136.     p1 = p2
  137.     b = CBool(p1)
  138. End Function

Ответить

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



Вопросов: 4
Ответов: 330
 Профиль | | #18 Добавлено: 11.02.10 09:04
офигеть! суша - это не миф! )

Winand, огромнейшее тебе спасибо!!!


p.s. правда на Case вылетает сразу (я даже не успеваю прочитать в чем ошибка), но это все мелочи жизни...
поставил Case 522 и Case Else (для тестирования кода) и все заработало

Ответить

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

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



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