VB 消息截获

1、API 引用,常量、变量定义

' 保存原消息函数地址

Public lpPrevWndProc As Long

' 热键消息常量

Public Const WM_HOTKEY = &H312

' Set/GetWindowLong 参数,表示对消息函数进行处理

Public Const GWL_WNDPROC = -4

' 用于返回原消息函数地址

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

' 用于设置新消息函数

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

' 用于调用原消息函数

Public 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

2、自定义的消息处理函数

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Debug.Print "Message: "; hw, uMsg, wParam, lParam

   If uMsg = WM_HOTKEY Then
      Msgbox "截获热键!"
      WindowProc = 0
   Else
      ' 调用原消息处理函数过程
      WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
   End If
End Function

3、设置消息处理函数

' 保存原消息函数地址,设置新消息函数地址

Public Sub Form_Load()
   lpPrevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
   SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WindowProc
End Sub

' 恢复原消息处理

Public Sub Form_Unload()
   SetWindowLong Me.hWnd, GWL_WNDPROC, lpPrevWndProc
End Sub