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

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mFrmHook"
  2. Option Explicit
  3. 'Public mHookAllForms As New Collection
  4. '是否call actFrm.FormActive
  5. Public NOExeActive As Boolean
  6. Private Const GWL_WNDPROC = (-4)
  7. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  8. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  9. Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
  10. Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
  11. Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
  12. Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  13. Private Const PROP_PREVPROC = "WinProc"
  14. Private Const PROP_OBJECT = "Object"
  15. Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
  16. ''return 0:pass the message;other:no pass
  17. 'Public Function WindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  18. 'WindowProc = 0
  19. 'End Function
  20. Private Function WindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  21. Dim lPrevProc As Long
  22. Dim oObj As frmBrowser
  23.    
  24.     ' Get the previous window procedure
  25.     lPrevProc = GetProp(hwnd, PROP_PREVPROC)
  26.     
  27.     Select Case wMsg
  28.         Case WM_NCACTIVATE
  29.             If wParam = 1 Then
  30.                 If Not NOExeActive Then
  31.                     'Set actFrm = mHookAllForms.Item(Str(hw))
  32.                     Set oObj = PtrToObj(GetProp(hwnd, PROP_OBJECT))
  33.                     Call oObj.FormActive
  34.                 End If
  35.             End If
  36.         Case WM_SIZE
  37.             If wParam = SIZE_MAXIMIZED Then
  38.                 wParam = 0
  39.             End If
  40.         Case WM_MOUSEACTIVATE
  41.             BringWindowToTop hwnd
  42.     End Select
  43.     
  44. '    If oObj.WindowProc(hwnd, wMsg, wParam, lParam) = 0 Then
  45.         WindowProc = CallWindowProc(lPrevProc, hwnd, wMsg, wParam, lParam)
  46. '    End If
  47.     
  48. End Function
  49. Private Function PtrToObj(ByVal lPtr As Long) As Object
  50. Dim oUnk As Object
  51.    MoveMemory oUnk, lPtr, 4&
  52.    Set PtrToObj = oUnk
  53.    MoveMemory oUnk, 0&, 4&
  54.             
  55. End Function
  56. Public Sub WebformHook(ByVal hwnd As Long, ByVal Obj As frmBrowser)
  57.    ' Set the properties
  58.    SetProp hwnd, PROP_OBJECT, ObjPtr(Obj)
  59.    SetProp hwnd, PROP_PREVPROC, GetWindowLong(hwnd, GWL_WNDPROC)
  60.    
  61.    ' Subclass the windows
  62.    SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc
  63.    
  64. End Sub
  65. Public Sub WebformUnhook(ByVal hwnd As Long)
  66. Dim lProc As Long
  67.    ' Get the window procedure
  68.    lProc = GetProp(hwnd, PROP_PREVPROC)
  69.    
  70.    ' Unsubclass the window
  71.    SetWindowLong hwnd, GWL_WNDPROC, lProc
  72.    
  73.    ' Remove the properties
  74.    RemoveProp hwnd, PROP_OBJECT
  75.    RemoveProp hwnd, PROP_PREVPROC
  76. End Sub
  77. 'Public Sub WebformHook(nHwnd As Long, lpPrevProc As Long) '将程序勾入消息环中
  78. 'lpPrevProc = SetWindowLong(nHwnd, GWL_WNDPROC, AddressOf WindowProc)
  79. 'End Sub
  80. '
  81. 'Public Sub WebformUnhook(nHwnd As Long, lpPrevProc As Long)
  82. 'Call SetWindowLong(nHwnd, GWL_WNDPROC, lpPrevProc)
  83. 'End Sub
  84. '##################################################################
  85. '##################################################################
  86. 'Option Explicit
  87. '
  88. 'Public mHookAllForms As New Collection
  89. '
  90. ''是否call actFrm.FormActive
  91. 'Public NOExeActive As Boolean
  92. '
  93. 'Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  94. 'On Error Resume Next
  95. 'Dim actFrm As frmBrowser ', dactFrm As frmBrowser
  96. 'Dim tc As frmBrowser
  97. 'Set tc = mHookAllForms.Item(Str(hw))
  98. '
  99. 'Select Case uMsg
  100. '    Case WM_NCACTIVATE
  101. '        'Debug.Print "WM_NCACTIVATE", wParam, lParam, hw
  102. '        If wParam = 1 Then
  103. '            If Not NOExeActive Then
  104. '                Set actFrm = mHookAllForms.Item(Str(hw))
  105. '                Call actFrm.FormActive
  106. ''                If actFrm.NoActive Then
  107. ''                    actFrm.NoActive = False
  108. ''                    'uMsg = 0
  109. ''                Else
  110. ''                    Call actFrm.FormActive
  111. ''                End If
  112. '            End If
  113. '        End If
  114. '    Case WM_SIZE
  115. '        If wParam = SIZE_MAXIMIZED Then
  116. '            'uMsg = 0
  117. '            wParam = 0 ' SIZE_MAXSHOW
  118. '        End If
  119. '
  120. '    'Case WM_MDIACTIVATE
  121. ''        If Not NOExeActive Then
  122. ''            'Debug.Print "active:"; hw, wParam, lParam
  123. ''            Set actFrm = mHookAllForms.item(Str(hw))
  124. ''            'Set dactFrm = mHookAllForms.Item(Str(wParam))
  125. ''
  126. ''            If hw = lParam Then
  127. ''                If actFrm.NoActive Then
  128. ''                    actFrm.NoActive = False
  129. ''                    uMsg = 0
  130. ''                Else
  131. ''                    Call actFrm.FormActive
  132. ''                End If
  133. ''            Else
  134. ''                'Call dactFrm.OrgWeb(actFrm.webMe)
  135. ''            End If
  136. ''        End If
  137. '    Case WM_MOUSEACTIVATE
  138. '        'Debug.Print "br"
  139. '        BringWindowToTop hw
  140. 'End Select
  141. ''If uMsg <> 0 Then Debug.Print hw, Hex(uMsg)
  142. '
  143. 'WindowProc = CallWindowProc(tc.lpPrevFormProc, hw, uMsg, wParam, lParam)
  144. 'End Function
  145. '
  146. 'Public Sub WebformHook(nHwnd As Long, lpPrevProc As Long) '将程序勾入消息环中
  147. 'lpPrevProc = SetWindowLong(nHwnd, GWL_WNDPROC, AddressOf WindowProc)
  148. 'End Sub
  149. '
  150. 'Public Sub WebformUnhook(nHwnd As Long, lpPrevProc As Long)
  151. 'Call SetWindowLong(nHwnd, GWL_WNDPROC, lpPrevProc)
  152. 'End Sub