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

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mGlobalInputHook"
  2. Option Explicit
  3. Public Declare Function GetForegroundWindow Lib "user32" () As Long
  4. Public Const HTCLIENT As Long = 1
  5. Private hKeyboardHook As Long
  6. Private hMouseHook As Long
  7. Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  8. Public Const KF_UP As Long = &H80000000
  9. Private Const ClassName_IE As String = "Internet Explorer_Server"
  10. Private Const ClassName_Flash As String = "MacromediaFlashPlayerActiveX"
  11. Private Const ClassName_ShellEmbedding As String = "Shell Embedding"
  12. Private Const ClassName_ShellDocObjectView As String = "Shell DocObject View"
  13. Private ClassNameFlag As Long
  14. Dim pX As Long, pY As Long
  15. 'Dim afterBF As Boolean
  16. 'Dim nowCur As Integer
  17. 'Dim hPreCur As Long
  18. 'Private Const bigGap As Integer = 15 * 15
  19. Private Const smallGap As Integer = 3 * 3
  20. 'Private Const mGap As Integer = 2
  21. Private mbtnDown As Boolean
  22. Private PointFormFrame As Object
  23. Private InRollMode As Boolean
  24. 'Public tg1 As Single
  25. 'Public tg2 As Single
  26. 'Public tg3 As Single
  27. 'Public tg4 As Single
  28. '右键点击的页面
  29. Private hDoWeb As Long
  30. 'Private hasCapture As Boolean
  31. ''鼠标各方向功能
  32. 'Public Const mouseEventCount As Long = 8
  33. 'Public mouse_event_prc(0 To mouseEventCount - 1) As New cCallByName
  34. 'Public def_mouse_event(0 To mouseEventCount - 1) As Long
  35. '按着左键单击右键
  36. Public mouse_event_leftright As New cCallByName
  37. Public def_mouse_event_leftright As Long
  38. Public mouse_event_rightleft As New cCallByName
  39. Public def_mouse_event_rightleft As Long
  40. Private DownClassName As String
  41. Private BeginFucntion As Boolean
  42. Private BeginMouseEvent As Boolean
  43. '是否正在拖动网页内容
  44. Public WebDraging As Boolean
  45. '######  keyboard hook ############
  46. '鼠标手势等变量
  47. Public MouseHand As New cMouseEvent
  48. Const ptGap As Single = 5 * 5
  49. Dim preDir As Long
  50. Private mHand(0 To 2) As Byte
  51. Private mHandPoint As Long
  52. Public Sub InstallKeyboardHook()
  53.     hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardHookProc, _
  54.             App.hInstance, App.ThreadID)
  55. End Sub
  56. Public Function KeyboardHookProc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  57. Dim Cancel As Long
  58. Cancel = 0
  59. If iCode = HC_ACTION Then
  60.     If (lParam And KF_UP) = 0 Then
  61.         If wParam = vbKeyE And vkPress(VK_CONTROL) And vkPress(VK_SHIFT) Then
  62.             gMainForm.Enabled = True
  63.         End If
  64.     End If
  65.     If GetForegroundWindow() = gMainForm.hwnd Then
  66.         If (lParam And KF_UP) = 0 Then
  67.             Cancel = gMainForm.DropMenu_KeyDown(wParam, lParam)
  68.         Else
  69.             Cancel = gMainForm.DropMenu_KeyUp(wParam, lParam)
  70.         End If
  71.     End If
  72. '    Select Case wParam
  73. '        Case vbKeyF6
  74. '            If vkPress(VK_CONTROL) Then
  75. '                gMainForm.cmbSearch.SetFocus
  76. '            Else
  77. '                gMainForm.cmbAdd.SetFocus
  78. '            End If
  79. '        Case vbKeyF3
  80. '            If (KF_UP And lParam) = 0 Then
  81. '                gMainForm.FindKeyWord
  82. '            End If
  83. '        Case vbKeyTab
  84. '            If vkPress(VK_CONTROL) Then
  85. '                If vkPress(VK_SHIFT) Then
  86. '                    If (KF_UP And lParam) = 0 Then
  87. '                        gMainForm.NextLastTab False
  88. '                        Cancel = 1
  89. '                    End If
  90. '                Else
  91. '                    If (KF_UP And lParam) = 0 Then
  92. '                        gMainForm.NextLastTab True
  93. '                        Cancel = 1
  94. '                    End If
  95. '                End If
  96. '            End If
  97. '    End Select
  98. End If
  99. If Cancel = 1 Then
  100.     KeyboardHookProc = 1
  101. Else
  102.     KeyboardHookProc = CallNextHookEx(hKeyboardHook, iCode, wParam, lParam)
  103. End If
  104. End Function
  105. Public Sub UninstallKeyboardHook()
  106.     If hKeyboardHook <> 0 Then
  107.         Call UnhookWindowsHookEx(hKeyboardHook)
  108.     End If
  109.     hKeyboardHook = 0
  110. End Sub
  111. '######### mouse hook #############
  112. Public Sub InstallMouseHook()
  113.     hMouseHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, _
  114.             App.hInstance, App.ThreadID)
  115. End Sub
  116. Public Function MouseHookProc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  117. Dim Cancel As Boolean
  118. Cancel = False
  119. On Error GoTo due
  120. Dim i&
  121. Dim nMouseInfo As MOUSEHOOKSTRUCT
  122. Dim tHWindowFromPoint As Long
  123. Dim tPt As POINTAPI
  124. Dim webRect As RECT
  125. If iCode = HC_ACTION Then
  126.     If loadedBrowserCount > 0 Then
  127.         If GetForegroundWindow = gMainForm.hwnd Then
  128.             CopyMemory nMouseInfo, ByVal lParam, Len(nMouseInfo)
  129.             tPt = nMouseInfo.pt
  130.             ScreenToClient nMouseInfo.hwnd, tPt
  131.             If nMouseInfo.wHitTestCode = 1 Then
  132.                 ClassNameFlag = GetClassNameFlag(nMouseInfo.hwnd)
  133.                 If ClassNameFlag > 0 Then
  134.                     Cancel = HandelWeb(wParam, webbState(gActiveWebIndex).webForm, nMouseInfo.hwnd, tPt, nMouseInfo.pt)
  135.                 End If
  136.             End If
  137.         End If
  138.     End If
  139.     
  140. End If
  141. If Cancel Then
  142.     MouseHookProc = 1
  143. Else
  144.     MouseHookProc = CallNextHookEx(hMouseHook, iCode, wParam, lParam)
  145. End If
  146. Exit Function
  147. due:
  148.     ErrorLog.AddLog "mousehookproc" & Chr(9) & Err.Description
  149.     
  150. End Function
  151. Public Sub UninstallMouseHook()
  152.     If hMouseHook <> 0 Then
  153.         Call UnhookWindowsHookEx(hMouseHook)
  154.     End If
  155.     hMouseHook = 0
  156. End Sub
  157. Private Function HandelWeb(wParam As Long, nWebForm As frmBrowser, hWeb As Long, mPt As POINTAPI, screenPt As POINTAPI) As Boolean
  158. On Error GoTo due
  159. Dim rtn As Boolean
  160. Dim xpos As Long, ypos As Long, cx As Long, cy As Long
  161. 'Dim isBF As Boolean
  162. rtn = False
  163. Select Case wParam
  164.     Case WM_LBUTTONUP
  165.         nWebForm.nTimer = Timer
  166.     Case WM_LBUTTONDOWN
  167.         If vkPress(VK_RBUTTON) Then
  168.             BeginFucntion = False
  169.             gMainForm.ChangeStatusText mouse_event_rightleft.EventText
  170.             mouse_event_rightleft.Execute nWebForm
  171.             rtn = True
  172.         Else
  173.             nWebForm.nTimer = Timer
  174.         End If
  175.     Case WM_MBUTTONDOWN
  176.         If Rollmode = 0 Then
  177.             pX = mPt.x: pY = mPt.y
  178.             'Set PointFormFrame = FindFrameFromPoint(nWebForm.webMe.Document, screenPt)
  179.             Set PointFormFrame = nWebForm.FindFrameFromPoint(screenPt.x, screenPt.y)
  180.             mbtnDown = True
  181.         End If
  182.         rtn = True
  183.     Case WM_MBUTTONUP
  184.         If Rollmode = 0 Then
  185.             mbtnDown = False
  186.             Set PointFormFrame = Nothing
  187.         Else
  188.             InRollMode = Not InRollMode
  189.             If InRollMode Then
  190.                 pX = mPt.x: pY = mPt.y
  191.                 'Set PointFormFrame = FindFrameFromPoint(nWebForm.webMe.Document, screenPt)
  192.                 Set PointFormFrame = nWebForm.FindFrameFromPoint(screenPt.x, screenPt.y)
  193.             End If
  194.         End If
  195.     Case WM_MOUSEMOVE
  196.         If vkPress(VK_RBUTTON) Then
  197.             If BeginFucntion Then
  198.                 Dim tDir As Long: tDir = -1
  199.                 xpos = mPt.x: ypos = mPt.y
  200.                 cx = xpos - pX: cy = -(ypos - pY)
  201. '                isBF = False
  202. '                If Not hasCapture Then
  203. '                    If cx * cx + cy * cy > smallGap Then
  204. '                        SetCapture hWeb
  205. '                        hasCapture = True
  206. '                    End If
  207. '                End If
  208.                 If Not BeginMouseEvent Then
  209.                     If cx * cx + cy * cy > smallGap Then
  210.                         'ReleaseCapture
  211.                         BeginMouseEvent = True
  212.                     End If
  213.                 End If
  214.                 Call GetMouseEvent(mPt)
  215. '                If cx * cx + cy * cy > bigGap Then
  216. '                    If cy >= cx * tg1 And cy < cx * tg2 Then
  217. '                        tDir = 0
  218. '                    ElseIf cy >= cx * tg2 And cy > cx * tg3 Then
  219. '                        tDir = 1
  220. '                    ElseIf cy <= cx * tg3 And cy > cx * tg4 Then
  221. '                        tDir = 2
  222. '                    ElseIf cy <= cx * tg4 And cy > cx * tg1 Then
  223. '                        tDir = 3
  224. '                    ElseIf cy <= cx * tg1 And cy > cx * tg2 Then
  225. '                        tDir = 4
  226. '                    ElseIf cy <= cx * tg2 And cy < cx * tg3 Then
  227. '                        tDir = 5
  228. '                    ElseIf cy >= cx * tg3 And cy < cx * tg4 Then
  229. '                        tDir = 6
  230. '                    ElseIf cy >= cx * tg4 And cy < cx * tg1 Then
  231. '                        tDir = 7
  232. '                    End If
  233. '                    If tDir > -1 Then
  234. '                        gMainForm.ChangeStatusText (mouse_event_prc(tDir).EventText)
  235. '                    End If
  236. '                Else
  237. '                    gMainForm.ChangeStatusText ("")
  238. '                    'Call SetCursor(hPreCur)
  239. '                End If
  240.             End If
  241.             rtn = True
  242.         ElseIf vkPress(VK_MBUTTON) And mbtnDown Then
  243.             Call MoveDocument(mPt)
  244.         ElseIf InRollMode Then
  245.             Call MoveDocument(mPt)
  246.         End If
  247.     Case WM_RBUTTONDOWN
  248.         rtn = True
  249.         If vkPress(VK_LBUTTON) Or vkPress(VK_CONTROL) Then
  250.             'If Not WebDraging Then
  251.             If Not gSelfDrag.SelfDraging Then
  252.                 ReleaseCapture
  253.                 'gMainForm.UnloadBrowser nWebForm.tagIndex
  254.                 gMainForm.ChangeStatusText mouse_event_leftright.EventText
  255.                 mouse_event_leftright.Execute nWebForm
  256.                 rtn = True
  257.             End If
  258.             
  259.         ElseIf vkPress(VK_RBUTTON) Then
  260.             rtn = True
  261.             If ClassNameFlag > 0 Then
  262.                 If GetClassNameFlag(WindowFromPoint(screenPt.x, screenPt.y)) > 0 Then
  263.                     BeginFucntion = True
  264.                     'BeginMouseEvent = False
  265.     '                hasCapture = False
  266.                     hDoWeb = hWeb
  267.                     
  268.                     'hPreCur = GetCursor()
  269.         
  270.         
  271.                     'Call getXY(lParam, pX, pY)
  272.                     pX = mPt.x: pY = mPt.y
  273.                     
  274.                     preDir = -1
  275.                     mHand(0) = 0: mHand(1) = 0: mHand(2) = 0
  276.                     mHandPoint = 0
  277.                 End If
  278.             Else
  279.                 BeginFucntion = False
  280.             End If
  281.         End If
  282. '==============================================
  283.     Case WM_RBUTTONUP
  284.         rtn = True
  285.         If vkPress(VK_LBUTTON) Or vkPress(VK_CONTROL) Then
  286. '            ReleaseCapture
  287. '            gMainForm.unloadBrowser nWebForm.tagIndex
  288. '            rtn = True
  289.         Else
  290.             If BeginFucntion Then
  291.                 BeginFucntion = False
  292.                 If BeginMouseEvent Then
  293.                     
  294.                     If hWeb = hDoWeb Then
  295.                         'Call HandleMouseEvent(nWebForm, mPt, hWeb)
  296.                         Call HandleMouseEvent2(nWebForm, mPt, hWeb)
  297.                     End If
  298.                     
  299.                     'ReleaseCapture
  300.                     
  301.                     rtn = BeginMouseEvent
  302.                     BeginMouseEvent = False
  303.                 Else
  304.                     rtn = True
  305.                     Call PostMessage(hWeb, WM_RBUTTONDOWN, _
  306.                         MK_RBUTTON, ByVal MAKELONG(mPt.x, mPt.y))
  307.                     If ClassNameFlag > 1 Then
  308.                         Call PostMessage(hWeb, WM_RBUTTONUP, _
  309.                             MK_RBUTTON, ByVal MAKELONG(mPt.x, mPt.y))
  310.                     End If
  311.                 End If
  312.             End If
  313.         End If
  314.         
  315. '        If hasCapture Then
  316. '            Call ReleaseCapture
  317. '            rtn = True
  318. '            hasCapture = False
  319. '        End If
  320. '==================================================
  321. End Select
  322. If wParam = WM_LBUTTONDOWN Or wParam = WM_RBUTTONDOWN Then InRollMode = False
  323. HandelWeb = rtn 'true: cancel ; false : normal
  324. Exit Function
  325. due:
  326.    ErrorLog.AddLog "handelweb" & Chr(9) & Err.Description
  327.    Resume Next
  328. End Function
  329. Public Function vkPress(vkcode As Long) As Boolean
  330. If (GetAsyncKeyState(vkcode) And &H8000) <> 0 Then
  331.     vkPress = True
  332. Else
  333.     vkPress = False
  334. End If
  335. End Function
  336. 'Private Function FindFrameFromPoint(nDoc As Object, nPt As POINTAPI) As Object
  337. 'On Error Resume Next
  338. 'Dim i&
  339. 'Dim frameCnt&
  340. 'Dim tDoc As Object
  341. 'Dim trc As RECT
  342. 'Dim rtn As Object
  343. 'Dim inSubFrame As Boolean
  344. 'inSubFrame = False
  345. '
  346. 'frameCnt = nDoc.frames.Length
  347. 'For i = 0 To frameCnt - 1
  348. '
  349. '    Set tDoc = Nothing
  350. '    Set tDoc = nDoc.frames(i).Document
  351. '    If Not tDoc Is Nothing Then
  352. '        Set rtn = FindFrameFromPoint(tDoc, nPt)
  353. '        If Not rtn Is Nothing Then
  354. '            inSubFrame = True
  355. '            Exit For
  356. '        End If
  357. '    End If
  358. 'Next i
  359. '
  360. ''不在其子Frame时
  361. 'If Not inSubFrame Then
  362. '    trc.Top = nDoc.parentWindow.screenTop
  363. '    trc.Left = nDoc.parentWindow.screenLeft
  364. '    trc.Right = trc.Left + nDoc.body.clientWidth
  365. '    trc.Bottom = trc.Top + nDoc.body.clientHeight
  366. '
  367. '    If PtInRect(trc, nPt.x, nPt.y) Then
  368. '        Set rtn = nDoc.parentWindow
  369. '    End If
  370. 'End If
  371. '
  372. 'Set FindFrameFromPoint = rtn
  373. '
  374. 'End Function
  375. Private Sub MoveDocument(mPt As POINTAPI)
  376.     Dim tRate As Long
  377.     Dim cx As Long, cy As Long
  378.     
  379.     If RollInvert = 0 Then
  380.         tRate = 1
  381.     Else
  382.         tRate = -1
  383.     End If
  384.     If vkPress(VK_CONTROL) Then
  385.         cx = (mPt.x - pX) * ScrollRate2 * tRate
  386.         cy = (mPt.y - pY) * ScrollRate2 * tRate
  387.     Else
  388.         cx = (mPt.x - pX) * ScrollRate * tRate
  389.         cy = (mPt.y - pY) * ScrollRate * tRate
  390.     End If
  391.     'nWebForm.webMe.Document.parentwindow.scrollby cx, cy
  392.     If Not PointFormFrame Is Nothing Then
  393.         
  394.         PointFormFrame.scrollBy cx, cy
  395.         pX = mPt.x: pY = mPt.y
  396.     End If
  397. End Sub
  398. 'Private Sub HandleMouseEvent(nWebForm As frmBrowser, mPt As POINTAPI, nHwnd As Long)
  399. 'Dim rtn As Boolean
  400. 'Dim xpos As Long, ypos As Long, cx As Long, cy As Long
  401. '
  402. 'Dim tDirection As Long
  403. '
  404. ''Call SetCursor(hPreCur)
  405. 'xpos = mPt.x: ypos = mPt.y
  406. 'cx = xpos - pX: cy = -(ypos - pY)
  407. ''isBF = False
  408. 'tDirection = -1
  409. 'If cx * cx + cy * cy > bigGap Then
  410. '    If cy >= cx * tg1 And cy < cx * tg2 Then
  411. '        tDirection = 0
  412. '    ElseIf cy >= cx * tg2 And cy > cx * tg3 Then
  413. '        tDirection = 1
  414. '    ElseIf cy <= cx * tg3 And cy > cx * tg4 Then
  415. '        tDirection = 2
  416. '    ElseIf cy <= cx * tg4 And cy > cx * tg1 Then
  417. '        tDirection = 3
  418. '    ElseIf cy <= cx * tg1 And cy > cx * tg2 Then
  419. '        tDirection = 4
  420. '    ElseIf cy <= cx * tg2 And cy < cx * tg3 Then
  421. '        tDirection = 5
  422. '    ElseIf cy >= cx * tg3 And cy < cx * tg4 Then
  423. '        tDirection = 6
  424. '    ElseIf cy >= cx * tg4 And cy < cx * tg1 Then
  425. '        tDirection = 7
  426. '    End If
  427. '    Debug.Print tDirection
  428. '    If tDirection > -1 Then
  429. ''        isBF = True
  430. '        'ReleaseCapture
  431. '        'SendMessage nHwnd, WM_CANCELMODE, 0&, 0&
  432. '        'DoEvents
  433. '        mouse_event_prc(tDirection).Execute nWebForm
  434. '    End If
  435. 'End If
  436. '
  437. 'End Sub
  438. Private Sub HandleMouseEvent2(nWebForm As frmBrowser, mPt As POINTAPI, nHwnd As Long)
  439. 'Dim tKey$
  440. Dim tObj As cCallByName
  441. If mHandPoint <= 3 Then
  442.     Set tObj = MouseHand.GetCallObject_ByKey2(mHand)
  443.     If Not tObj Is Nothing Then
  444.         Debug.Print "HandleMouseEvent2", tObj.InsideIndex
  445.         DoEvents
  446.         tObj.Execute nWebForm
  447.     End If
  448. End If
  449. gMainForm.ChangeStatusText ""
  450. End Sub
  451. Private Function GetClassNameVb(nHwnd As Long) As String
  452. Dim rtn As String, tLen&
  453. rtn = Space(255)
  454. tLen = GetClassName(nHwnd, rtn, 255)
  455. If tLen > 0 Then
  456.     rtn = Left(rtn, tLen)
  457. Else
  458.     rtn = ""
  459. End If
  460. GetClassNameVb = rtn
  461. End Function
  462. 'Private Sub PopFavoriteMenu(ByVal wParam As Long, ByVal lParam As Long)
  463. 'Dim tMHS As MOUSEHOOKSTRUCT
  464. 'Dim tHwnd&, tMenuPos&
  465. 'If wParam = WM_RBUTTONUP Then
  466. '    CopyMemory tMHS, ByVal lParam, Len(tMHS)
  467. '    tHwnd = WindowFromPoint(tMHS.pt.x, tMHS.pt.y)
  468. '    Debug.Print tMHS.hwnd, tHwnd, gMainForm.hMnuFavorite
  469. '    If tHwnd <> 0 Then
  470. '        Debug.Print gMainForm.hwnd
  471. '        If IsMenu(tHwnd) <> 0 Then
  472. '            tMenuPos = MenuItemFromPoint(gMainForm.hwnd, tHwnd, tMHS.pt)
  473. '            Debug.Print tMenuPos
  474. '        End If
  475. '    End If
  476. 'End If
  477. 'End Sub
  478. 'Private Function FindFrameFromPoint(nDoc As Object, nPt As POINTAPI) As Object
  479. 'On Error Resume Next
  480. 'Dim i&
  481. 'Dim frameCnt&
  482. 'Dim tDoc As Object
  483. 'Dim tRc As RECT
  484. 'Dim rtn As Object
  485. 'Dim inSubFrame As Boolean
  486. 'inSubFrame = False
  487. '
  488. 'frameCnt = nDoc.Frames.Length
  489. 'For i = 1 To frameCnt
  490. '
  491. '    Set tDoc = Nothing
  492. '    Set tDoc = nDoc.Frames(i).Document
  493. '
  494. '    If Not tDoc Is Nothing Then
  495. '        tRc.Top = nDoc.Frames(i).screenTop
  496. '        tRc.Left = nDoc.Frames(i).screenLeft
  497. '        tRc.Right = tRc.Left + tDoc.body.ClientWidth
  498. '        tRc.Bottom = tRc.Top + tDoc.body.ClientHeight
  499. '
  500. '        If PtInRect(tRc, nPt.x, nPt.y) Then
  501. '            Set rtn = nDoc.Frames(i)
  502. '            inSubFrame = True
  503. '            Exit For
  504. '        End If
  505. '    End If
  506. 'Next i
  507. '
  508. 'If Not inSubFrame Then
  509. '    Set rtn = nDoc.parentwindow
  510. 'End If
  511. '
  512. 'Set FindFrameFromPoint = rtn
  513. '
  514. 'End Function
  515. Public Function MAKELONG(wLow As Long, wHigh As Long) As Long
  516. MAKELONG = wHigh * &H10000 + wLow
  517. End Function
  518. Public Function GetClassNameFlag(nHwnd As Long) As Long
  519. 'Dim ClassNmaeFlag As Long
  520. Dim DownClassName As String
  521. DownClassName = GetClassNameVb(nHwnd)
  522. Select Case DownClassName
  523.     Case ClassName_IE
  524.         ClassNameFlag = 2
  525.     Case ClassName_Flash
  526.         ClassNameFlag = 1
  527.     Case ClassName_ShellDocObjectView
  528.         ClassNameFlag = 8
  529.     Case ClassName_ShellEmbedding
  530.         ClassNameFlag = 4
  531.     Case Else
  532.         ClassNameFlag = 0
  533. End Select
  534. GetClassNameFlag = ClassNameFlag
  535. End Function
  536. Public Function GetMouseEvent(nPt As POINTAPI) As Long
  537. Dim cx&, cy&
  538. Dim rtn&
  539. Dim tStu$
  540. Dim tObj As cCallByName
  541. rtn = -1
  542. cx = nPt.x - pX: cy = -(nPt.y - pY)
  543. If cx * cx + cy * cy > ptGap Then
  544.     If cx > 0 And Abs(cy) <= cx Then
  545.         rtn = 1
  546.     ElseIf cy > 0 And Abs(cx) <= cy Then
  547.         rtn = 2
  548.     ElseIf cx < 0 And Abs(cy) <= Abs(cx) Then
  549.         rtn = 3
  550.     ElseIf cy < 0 And Abs(cx) <= Abs(cy) Then
  551.         rtn = 4
  552.     End If
  553.     'mPt = nPt
  554.     pX = nPt.x: pY = nPt.y
  555.     If preDir <> rtn Then
  556.         tStu = "鼠标手势: "
  557.         If mHandPoint < 3 Then
  558.             mHandPoint = mHandPoint + 1
  559.             mHand(mHandPoint - 1) = rtn
  560.             
  561.             tStu = tStu & DebugDir(mHand(0)) & DebugDir(mHand(1)) & _
  562.                         DebugDir(mHand(2))
  563.             Set tObj = MouseHand.GetCallObject_ByKey2(mHand)
  564.             If Not tObj Is Nothing Then
  565.                 tStu = tStu & " => " & tObj.EventText
  566.             End If
  567.         Else
  568.             mHandPoint = 4
  569.             tStu = tStu & "(无效)"
  570.         End If
  571.         'Call DebugDir(rtn)
  572.         gMainForm.ChangeStatusText tStu
  573.         preDir = rtn
  574.     End If
  575. End If
  576. GetMouseEvent = rtn
  577. End Function
  578. Public Function DebugDir(ByVal nDir&) As String
  579. Dim tstr$
  580. Select Case nDir
  581.     Case 1
  582.         tstr = "右"
  583.     Case 2
  584.         tstr = "上"
  585.     Case 3
  586.         tstr = "左"
  587.     Case 4
  588.         tstr = "下"
  589.     Case Else
  590.         tstr = ""
  591. End Select
  592. 'Debug.Print Timer, tstr
  593. DebugDir = tstr
  594. End Function