如何建立窗口钩子呢?
比如要监测其它软件窗体的变化,如何实现呢?

解决方案 »

  1.   

    http://post.baidu.com/f?ct=335675392&tn=baiduPostBrowser&sc=2368855222&z=136236976&pn=0&rn=50&lm=0&word=vb#2368855222
    有资料
      

  2.   

    用DLL的话,倒是可以....不过我不想用DLL,嘿嘿
      

  3.   

    Option ExplicitPublic 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
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
    Private 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
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Const SWP_NOZORDER = &H4
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_DRAWFRAME = &H20
    Private Const WS_THICKFRAME = &H40000
    Private Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_GETMINMAXINFO = &H24
    Public OldWindowProc As LongPrivate Type POINTAPI
        x As Long
        y As Long
    End TypePrivate Type MINMAXINFO
        ptReserved As POINTAPI
        ptMaxSize As POINTAPI
        ptMaxPosition As POINTAPI
        ptMinTrackSize As POINTAPI
        ptMaxTrackSize As POINTAPI
    End Type'限制窗体大小为620*497(子类化技术)
    Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
        If Msg = WM_GETMINMAXINFO Then
            Dim MinMax As MINMAXINFO
            CopyMemory MinMax, ByVal lp, Len(MinMax)
            MinMax.ptMinTrackSize.x = 620
            MinMax.ptMinTrackSize.y = 492
            CopyMemory ByVal lp, MinMax, Len(MinMax)
            WndProc = 1
            Exit Function
        End If
        WndProc = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
    End Function'控制指定窗体是否可以调整大小(可以把controlName声明为object就可以调整任何控件了)
    Public Sub ControlSize(ByVal controlName As Form, setTrue As Boolean)
        Dim dwStyle As Long
        dwStyle = GetWindowLong(controlName.hwnd, GWL_STYLE)
        If setTrue Then
            dwStyle = dwStyle Or WS_THICKFRAME
        Else
            dwStyle = dwStyle - WS_THICKFRAME
        End If
        dwStyle = SetWindowLong(controlName.hwnd, GWL_STYLE, dwStyle)
        SetWindowPos controlName.hwnd, controlName.hwnd, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME
    End Sub
      

  4.   

    To:chenhui530(陈辉) 
    你这段代码只能对自身窗口才有用吧,我主要是想钩住别的窗体的信息。