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

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mPMenuMessage"
  2. Option Explicit
  3. 'Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  4. 'Public Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  5. 'Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  6. 'Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  7. Private 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
  8. Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  9. Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  10. Private Const WH_MSGFILTER As Long = (-1)
  11. Public Const MSGF_MENU As Long = 2
  12. 'Public Type MSG
  13. '    hwnd As Long
  14. '    message As Long
  15. '    wParam As Long
  16. '    lParam As Long
  17. '    time As Long
  18. '    pt As POINTAPI
  19. '
  20. 'End Type
  21. Private hhookMsg&
  22. Private mFirstMove As Boolean
  23. Public Sub SetMenuMsgHook()
  24. If hhookMsg = 0 Then
  25.     mFirstMove = True
  26.     hhookMsg = SetWindowsHookEx(WH_MSGFILTER, AddressOf MenuMessageProc, App.hInstance, App.ThreadID)
  27.     
  28.     Debug.Print "hook:"; hhookMsg
  29. End If
  30. End Sub
  31. Public Function MenuMessageProc(ByVal code&, ByVal wParam&, ByVal lParam&) As Long
  32. Dim tMSG As MSG
  33. If code = MSGF_MENU Then
  34.     CopyMemory tMSG, ByVal lParam, Len(tMSG)
  35.     Select Case tMSG.message
  36.         Case WM_MOUSEMOVE
  37.             If mFirstMove Then
  38.                 mFirstMove = False
  39.             Else
  40.                 gMainForm.DropMenu_MouseMove tMSG.pt.x, tMSG.pt.y
  41.             End If
  42.         Case WM_KEYDOWN
  43.             Select Case tMSG.wParam
  44.                 Case VK_LEFT
  45.                     gMainForm.DropMenu_ShowNextMenu False
  46.                 Case VK_RIGHT
  47.                     gMainForm.DropMenu_ShowNextMenu True
  48.             End Select
  49.         Case WM_RBUTTONUP
  50.             Call PopupMenuMenu(tMSG.pt.x, tMSG.pt.y)
  51.         Case WM_LBUTTONDBLCLK
  52.             Call DbClickFavMenu(tMSG.pt.x, tMSG.pt.y)
  53.             
  54.     End Select
  55. End If
  56. MenuMessageProc = CallNextHookEx(hhookMsg, code, wParam, lParam)
  57. End Function
  58. Public Sub UnSetMenuMsgHook()
  59. If hhookMsg <> 0 Then
  60.     UnhookWindowsHookEx hhookMsg
  61. End If
  62. 'Debug.Print "unsethook:"; hhookMsg
  63. hhookMsg = 0
  64. End Sub
  65. '判断并弹出收藏夹右键菜单
  66. Private Sub PopupMenuMenu(x&, y&)
  67. Dim i&, tPos&
  68. Dim tHwnd&
  69. tHwnd = gMainForm.hwnd
  70. For i = 0 To subMenuCount
  71.     If loadSubInfo(i).isLoadSub Then
  72.         tPos = MenuItemFromPoint(tHwnd, loadSubInfo(i).hwnd, x, y)
  73.         If tPos >= 0 Then
  74.             Call MENURBUTTONUP(tHwnd, tPos, loadSubInfo(i).hwnd)
  75.             Exit For
  76.         End If
  77.     End If
  78. Next i
  79. End Sub
  80. Private Sub DbClickFavMenu(x&, y&)
  81. Dim i&, tPos&
  82. Dim tHwnd&
  83. tHwnd = gMainForm.hwnd
  84. tPos = -1
  85. For i = 0 To subMenuCount
  86.     If loadSubInfo(i).isLoadSub Then
  87.         tPos = MenuItemFromPoint(tHwnd, loadSubInfo(i).hwnd, x, y)
  88.         If tPos >= 0 Then
  89.             Call FindSubmnuAndOpenExplorer(loadSubInfo(i).hwnd, tPos)
  90.             Exit For
  91.         End If
  92.     End If
  93. Next i
  94. End Sub
  95. Private Sub FindSubmnuAndOpenExplorer(vHmnu&, vPos&)
  96. Dim tId&
  97. Dim tHSubMenu&
  98. Dim tShell As cShowFilePropertyWindow
  99. Dim i&
  100. tId = GetMenuItemID(vHmnu, vPos)
  101. If tId = -1 Then
  102.     tHSubMenu = GetSubMenu(vHmnu, vPos)
  103.     For i = 1 To subMenuCount
  104.         If tHSubMenu = loadSubInfo(i).hwnd Then
  105.             Set tShell = New cShowFilePropertyWindow
  106.             PostMessage gMainForm.hwnd, WM_CANCELMODE, 0&, ByVal 0&
  107.             tShell.ShowProps loadSubInfo(i).path, verbShowExplorer
  108.             Exit For
  109.         End If
  110.     Next i
  111. End If
  112. End Sub