mMouseHook.bas
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:7k
源码类别:

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mMouseHook"
  2. Option Explicit
  3. '#####  keyboard and mouse hook ##################
  4. Public Type POINTAPI
  5.     x As Long
  6.     y As Long
  7. End Type
  8. Public Type MOUSEHOOKSTRUCT
  9.     pt As POINTAPI
  10.     hwnd As Long
  11.     wHitTestCode As Long
  12.     dwExtraInfo As Long
  13. End Type
  14. Public Declare Function CallNextHookEx Lib "user32" _
  15.         (ByVal hHook As Long, _
  16.         ByVal ncode As Long, _
  17.         ByVal wParam As Long, _
  18.         ByVal lParam As Long) As Long
  19. Public Declare Function SetWindowsHookEx Lib "user32" _
  20.         Alias "SetWindowsHookExA" _
  21.         (ByVal idHook As Long, _
  22.         ByVal lpfn As Long, _
  23.         ByVal hmod As Long, _
  24.         ByVal dwThreadId As Long) As Long
  25. Public Declare Function UnhookWindowsHookEx Lib "user32" _
  26.         (ByVal hHook As Long) As Long
  27. Public Const WH_KEYBOARD As Long = 2
  28. Public Const WH_MOUSE As Long = 7
  29. Public Const HC_SYSMODALOFF = 5
  30. Public Const HC_SYSMODALON = 4
  31. Public Const HC_SKIP = 2
  32. Public Const HC_GETNEXT = 1
  33. Public Const HC_ACTION = 0
  34. Public Const HC_NOREMOVE As Long = 3
  35. '##########################################
  36. Public Const HTCLIENT As Long = 1
  37. Private hKeyboardHook As Long
  38. Private hMouseHook As Long
  39. Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  40. Private Const KF_UP As Long = &H80000000
  41. Private ClassNameFlag As Long
  42. Dim pX As Long, pY As Long
  43. Dim afterBF As Boolean
  44. Dim nowCur As Integer
  45. Dim hPreCur As Long
  46. Private Const smallGap As Integer = 3 * 3
  47. Private mbtnDown As Boolean
  48. Private PointFormFrame As Object
  49. Private InRollMode As Boolean
  50. '右键点击的页面
  51. Private hDoWeb As Long
  52. Private DownClassName As String
  53. Private BeginFucntion As Boolean
  54. Private BeginMouseEvent As Boolean
  55. '是否正在拖动网页内容
  56. Public WebDraging As Boolean
  57. '鼠标手势等变量
  58. 'Public MouseHand As New cMouseEvent
  59. Const ptGap As Single = 5 * 5
  60. Dim preDir As Long
  61. Private mHand(0 To 2) As Byte
  62. Private mHandPoint As Long
  63. '######### mouse hook #############
  64. Public Sub InstallMouseHook()
  65.     hMouseHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, _
  66.             App.hInstance, App.ThreadID)
  67. End Sub
  68. Public Function MouseHookProc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  69. Dim Cancel As Boolean
  70. Cancel = False
  71. Dim i&
  72. Dim nMouseInfo As MOUSEHOOKSTRUCT
  73. Dim tHWindowFromPoint As Long
  74. Dim tPt As POINTAPI
  75. Dim webRect As RECT
  76. 'Dim tClassName As String
  77. If iCode = HC_ACTION Then
  78.     CopyMemory nMouseInfo, ByVal lParam, Len(nMouseInfo)
  79.     tPt = nMouseInfo.pt
  80.     If IsWebCtrl(nMouseInfo.hwnd) Then
  81.         ScreenToClient nMouseInfo.hwnd, tPt
  82.         Cancel = HandelWeb(nMouseInfo.hwnd, wParam, tPt, nMouseInfo.pt)
  83.     End If
  84. End If
  85. If Cancel Then
  86.     MouseHookProc = 1
  87. Else
  88.     MouseHookProc = CallNextHookEx(hMouseHook, iCode, wParam, lParam)
  89. End If
  90. End Function
  91. Public Sub UninstallMouseHook()
  92.     If hMouseHook <> 0 Then
  93.         Call UnhookWindowsHookEx(hMouseHook)
  94.     End If
  95.     hMouseHook = 0
  96. End Sub
  97. 'Private Function HandelWeb(wParam As Long, hWeb As Long, mPt As POINTAPI, screenPt As POINTAPI) As Boolean
  98. Private Function HandelWeb(hWeb As Long, wParam As Long, mPt As POINTAPI, screenPt As POINTAPI) As Boolean
  99. On Error GoTo due
  100. Dim rtn As Boolean
  101. Dim xpos As Long, ypos As Long, cx As Long, cy As Long
  102. rtn = False
  103. Select Case wParam
  104.     Case WM_MOUSEMOVE
  105.         If vkPress(VK_RBUTTON) Then
  106.             If BeginFucntion Then
  107.                 Dim tDir As Long: tDir = -1
  108.                 xpos = mPt.x: ypos = mPt.y
  109.                 cx = xpos - pX: cy = -(ypos - pY)
  110.                 If Not BeginMouseEvent Then
  111.                     If cx * cx + cy * cy > smallGap Then
  112.                         BeginMouseEvent = True
  113.                     End If
  114.                 End If
  115.                 If BeginMouseEvent Then
  116.                     Call GetMouseEvent(mPt)
  117.                 End If
  118.             End If
  119.             rtn = True
  120.         End If
  121.     Case WM_RBUTTONDOWN
  122.         If vkPress(VK_RBUTTON) Then
  123.             rtn = True
  124.             BeginFucntion = True
  125.             pX = mPt.x: pY = mPt.y
  126.             preDir = -1
  127.             mHand(0) = 0: mHand(1) = 0: mHand(2) = 0
  128.             mHandPoint = 0
  129.         End If
  130.     Case WM_RBUTTONUP
  131.         rtn = True
  132.         If BeginFucntion Then
  133.             BeginFucntion = False
  134.             If BeginMouseEvent Then
  135.                 Call HandleMouseEvent2(mPt, hWeb)
  136.                 BeginMouseEvent = False
  137.             Else
  138.                 Call PostMessage(hWeb, WM_RBUTTONDOWN, _
  139.                     MK_RBUTTON, ByVal MAKELONG(mPt.x, mPt.y))
  140.                 Call PostMessage(hWeb, WM_RBUTTONUP, _
  141.                     MK_RBUTTON, ByVal MAKELONG(mPt.x, mPt.y))
  142.             End If
  143.         End If
  144. End Select
  145. 'If wParam = WM_LBUTTONDOWN Or wParam = WM_RBUTTONDOWN Then InRollMode = False
  146. HandelWeb = rtn 'true: cancel ; false : normal
  147. Exit Function
  148. due:
  149. '   ErrorLog.AddLog "handelweb" & Chr(9) & Err.Description
  150.    Resume Next
  151. End Function
  152. 'Private Sub MoveDocument(mPt As POINTAPI)
  153. '    Dim tRate As Long
  154. '    Dim cx As Long, cy As Long
  155. '
  156. '    If RollInvert = 0 Then
  157. '        tRate = 1
  158. '    Else
  159. '        tRate = -1
  160. '    End If
  161. '    If vkPress(VK_CONTROL) Then
  162. '        cx = (mPt.x - pX) * ScrollRate2 * tRate
  163. '        cy = (mPt.y - pY) * ScrollRate2 * tRate
  164. '    Else
  165. '        cx = (mPt.x - pX) * ScrollRate * tRate
  166. '        cy = (mPt.y - pY) * ScrollRate * tRate
  167. '    End If
  168. '    'nWebForm.webMe.Document.parentwindow.scrollby cx, cy
  169. '    If Not PointFormFrame Is Nothing Then
  170. '
  171. '        PointFormFrame.scrollBy cx, cy
  172. '        pX = mPt.x: pY = mPt.y
  173. '    End If
  174. 'End Sub
  175. '
  176. Private Sub HandleMouseEvent2(mPt As POINTAPI, nHwnd As Long)
  177. On Error Resume Next
  178. If mHandPoint = 1 Then
  179.     Select Case mHand(0)
  180.         Case 1  'right
  181.             IEBrowser.GoForward
  182.         Case 2  'up
  183.             IEBrowser.Refresh
  184.         Case 3  'left
  185.             IEBrowser.GoBack
  186.         Case 4  'down
  187.             SendMessage IEBrowser.hwnd, WM_SYSCOMMAND, SC_CLOSE, 0&
  188.     End Select
  189. End If
  190. End Sub
  191. Public Function GetMouseEvent(nPt As POINTAPI) As Long
  192. Dim cx&, cy&
  193. Dim rtn&
  194. rtn = -1
  195. cx = nPt.x - pX: cy = -(nPt.y - pY)
  196. If cx * cx + cy * cy > ptGap Then
  197.     If cx > 0 And Abs(cy) <= cx Then
  198.         rtn = 1
  199.     ElseIf cy > 0 And Abs(cx) <= cy Then
  200.         rtn = 2
  201.     ElseIf cx < 0 And Abs(cy) <= Abs(cx) Then
  202.         rtn = 3
  203.     ElseIf cy < 0 And Abs(cx) <= Abs(cy) Then
  204.         rtn = 4
  205.     End If
  206.     'mPt = nPt
  207.     pX = nPt.x: pY = nPt.y
  208.     If preDir <> rtn Then
  209.         If mHandPoint < 3 Then
  210.             mHandPoint = mHandPoint + 1
  211.             mHand(mHandPoint - 1) = rtn
  212.         Else
  213.             mHandPoint = 4
  214.         End If
  215.         preDir = rtn
  216.     End If
  217. End If
  218. GetMouseEvent = rtn
  219. End Function
  220. 'Public Function DebugDir(ByVal nDir&) As String
  221. 'Dim tstr$
  222. 'Select Case nDir
  223. '    Case 1
  224. '        tstr = "右"
  225. '    Case 2
  226. '        tstr = "上"
  227. '    Case 3
  228. '        tstr = "左"
  229. '    Case 4
  230. '        tstr = "下"
  231. '    Case Else
  232. '        tstr = ""
  233. 'End Select
  234. 'Debug.Print Timer, tstr
  235. 'DebugDir = tstr
  236. 'End Function