有啊
HOOK
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const WM_ACTIVATE = &H6
Public Const GWL_WNDPROC = (-4)
FORM_LOAD时
prevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)FORM_UNLOAD时
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
    If Msg = WM_ACTIVATE Then
        If wParam = 0 Then
            MainForm.Caption = "失去焦点"
        Else
            MaiForm.Caption = "得到焦点"
        End If
    End If
End Function

解决方案 »

  1.   

    不好意思
    丢了一个函数声明
    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.   

    还有注意啊
    用HOOK的时候调试要万分小心,否则就会非法操作
    因为在那个时候IDE是最顶层的父,一不小心就会对它有影响
      

  3.   

    这是没办法的事情
    VB在设计的时候就没准备这个
    不过编译之后就不会有这个问题
    前提是FORM_UNLOAD的时候要把以前的窗口处理函数赋回去
      

  4.   

    失去焦点事件得到了,可得到焦点没有:(
      Select Case uMsg
          '加入对WM_NCACTIVATE消息的处理
        Case WM_NCACTIVATE
            bActive = False
        Case WM_ACTIVATE
            bActive = True
        Case Else
          MyWindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
      End Select