我用钩子程序来捕获,tab键消息,但是当切换到别的窗口的时候,必须将钩子程序关闭,我做的是当vb窗口失去焦点的时候,关闭钩子程序,可是当使用crl+c,拷贝东西,然后再用Alt + Tab返回vb程序的时候,被拷贝东西的文本,或work就会被关闭,应该怎样解决这个问题???
先多谢各位大虾.....

解决方案 »

  1.   

    GetForegroundWindow VB声明 
    Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long 
    说明 
    获得前台窗口的句柄。这里的“前台窗口”是指前台应用程序的活动窗口 
    返回值 
    Long,前台窗口的句柄 
    注解 
    windows nt支持多个桌面,它们相互间是独立的。每个桌面都有自己的前台窗口
     
    ===================================
    加个TIMER控件,对比一下你钩的窗体和GetForegroundWindow得到的是不是一个句柄。
      

  2.   

    '模块中的代码
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal _
    wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As LongPublic 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 WM_NCACTIVATE = &H86
    Public Const GWL_WNDPROC = (-4)
    Public OldWndProc&Public Function Hook&(ByVal hWnd1&)
    OldWndProc = SetWindowLong(hWnd1, GWL_WNDPROC, AddressOf NewWndProc)
    Hook = OldWndProc
    End FunctionPublic Sub UnHook(ByVal hWnd1&)
    SetWindowLong hWnd1, GWL_WNDPROC, OldWndProc
    End SubPublic Function NewWndProc&(ByVal hWnd1&, ByVal uMsg&, ByVal wParam&, ByVal lParam&)
    If uMsg = WM_NCACTIVATE Then
       If wParam = 0 Then '失去焦点
          Debug.Print "失去焦点" '可以在这里写钩子程序停止的代码
       Else
           Debug.Print "窗口获得焦点"
       End If
    End If
    NewWndProc = CallWindowProc(OldWndProc, hWnd1, uMsg, wParam, lParam)
    End Function'窗体中的代码Private Sub Form_Load()
    Hook Me.hWnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    UnHook Me.hWnd
    End Sub