拦截WINDOWS消息.txt
上传用户:albinfu
上传日期:2021-08-24
资源大小:71k
文件大小:4k
源码类别:

杀毒

开发平台:

Visual Basic

  1. ' * * * * * * * * * * Caution * * * * * * * * * * * * *
  2. ' Changes made to the functions contained herein can cause VB to crash!
  3. ' SAVE YOUR CHANGES BEFORE RUNNING THIS PROGRAM IN THE VB IDE!
  4. ' DO NOT ENTER BREAK MODE! DOING SO WILL CRASH VB!
  5. ' * * * * * * * * * * Caution * * * * * * * * * * * * *
  6. Option Explicit
  7. Public OldWindowProc As Long  ' Original window proc
  8. ' Function to retrieve the address of the current Message-Handling routine
  9. Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  10. ' Function to define the address of the Message-Handling routine
  11. Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  12. ' Function to copy an object/variable/structure passed by reference onto a variable of your own
  13. Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
  14. ' Function to execute a function residing at a specific memory address
  15. 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
  16. ' This is the message constant
  17. Public Const WM_GETMINMAXINFO = &H24
  18. ' This is a structure referenced by the MINMAXINFO structure
  19. Type POINTAPI
  20.      x As Long
  21.      y As Long
  22. End Type
  23. ' This is the structure that is passed by reference (ie an address) to your message handler
  24. ' The key items in this structure are ptMinTrackSize and ptMaxTrackSize
  25. Type MINMAXINFO
  26.         ptReserved As POINTAPI
  27.         ptMaxSize As POINTAPI
  28.         ptMaxPosition As POINTAPI
  29.         ptMinTrackSize As POINTAPI
  30.         ptMaxTrackSize As POINTAPI
  31. End Type
  32. Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
  33.     
  34.     ' Watch for the pertinent message to come in
  35.     If Msg = WM_GETMINMAXINFO Then
  36.         Dim MinMax As MINMAXINFO
  37.         
  38.         ' This is necessary because the structure was passed by its address and there
  39.         ' is currently no intrinsic way to use an address in Visual Basic
  40.         CopyMemory MinMax, ByVal lp, Len(MinMax)
  41.         
  42.         ' This is where you set the values of the MinX,MinY,MaxX, and MaxY
  43.         ' The values placed in the structure must be in pixels. The values
  44.         ' normally used in Visual Basic are in twips. The conversion is as follows:
  45.         ' pixels = twipstwipsperpixel
  46.         MinMax.ptMinTrackSize.x = 3975  Screen.TwipsPerPixelX
  47.         MinMax.ptMinTrackSize.y = 1740  Screen.TwipsPerPixelY
  48.         MinMax.ptMaxTrackSize.x = Screen.Width  Screen.TwipsPerPixelX  2
  49.         MinMax.ptMaxTrackSize.y = 3480  Screen.TwipsPerPixelY
  50.         
  51.         ' Here we copy the datastructure back up to the address passed in the parameters
  52.         ' because Windows will look there for the information.
  53.         CopyMemory ByVal lp, MinMax, Len(MinMax)
  54.         
  55.         ' This message tells Windows that the message was handled successfully
  56.         SubClass1_WndMessage = 1
  57.         Exit Function
  58.                 
  59.     End If
  60.         
  61.     ' Here, we forward all irrelevant messages on to the default message handler.
  62.     SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
  63.         
  64. End Function
  65. Option Explicit
  66. ' This constant is used to refer to the Message Handling function in a given window
  67. Private Const GWL_WNDPROC = (-4)
  68. Private Sub Form_Load()
  69.     
  70.     ' First, we need to store the address of the existing Message Handler
  71.     OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
  72.     
  73.     ' Now we can tell windows to forward all messages to out own Message Handler
  74.     Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
  75.     
  76. End Sub
  77. Private Sub Form_Unload(Cancel As Integer)
  78.     
  79.     ' We must return control of the messages back to windows before the program exits
  80.     Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
  81. End Sub