我想每当一个form重新获得焦点时(比如现在是IE游览器,再点这个form,form重新获得焦点),执行一断代码,如何实现?
我试了
Private Sub Form_Activate()这个只能在由不可见变为可见时起作用,
Private Sub Form_GotFocus()这个,如果form中有控件,就不起作用,
请问有没有别的方法呢?

解决方案 »

  1.   

    上面的两种对vb内部来说得失焦点有效,你要和外部有关联估计还是要用api,
    具体的等高高手帮你解决吧
      

  2.   

    又要提子类化了
    窗体获得焦点时改变标题栏为当前时间。注意窗体名是Form1
    添加一个模块,粘贴以下代码:
    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 LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_KILLFOCUS = &H8
    Public Const WM_ACTIVATE = &H6Public PrevProc As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
        If uMsg = WM_ACTIVATE And wParam = 2 Then
            Form1.Caption = Now '窗体激活执行此代码
        End If
    End Function
    窗体Form1的代码:
    Private Sub Form_Load()
        PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hwnd, GWL_WNDPROC, PrevProc
    End Sub
      

  3.   

    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 LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_KILLFOCUS = &H8
    Public Const WM_SETFOCUS As Integer = &H7Public PrevProc As Long, iCount As IntegerPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
        If uMsg = WM_SETFOCUS And iCount > 0 Then
            Form1.Caption = Now '窗体激活执行此代码
        End If
    Debug.Print iCount
    End FunctionPrivate Sub Form_Load()    PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Resize()
    iCount = iCount + 1
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hwnd, GWL_WNDPROC, PrevProc
    End Sub学习一下蚜虫的方法