我是要拦截窗口最大化,最小化,位置,大小,关闭这些消息。窗口回调函数和hook都试了,不知道为什么不起作用,窗口回调函数还好。在调试时还有用,生成 ActiveX dll就没用,听说是要在同进程才行,不知道有没有方法让他在别的进程也能用,hook就一点用都没有了,直接返回0,求助大神解决。如果有这方面的视频麻烦也给我一分
代码有点多,我直接上传到百度网盘了
http://pan.baidu.com/s/1kT1dAUN
Option Explicit
'Hook钩子类型
Public Const WH_CALLWNDPROC = 4  '发给窗口的消息 线程或系统
Public Const WH_CALLWNDPROCRET = 12  '窗口返回的消息 线程或系统
Public Const WH_CBT = 5  '窗口变化、焦点设定等消息 线程或系统
Public Const WH_DEBUG = 9 '是否执行其它Hook的Hook 线程或系统
Public Const WH_FOREGROUNDIDLE = 11   '前台程序空闲 线程或系统
Public Const WH_GETMESSAGE = 3 '投放至消息队列中的消息 线程或系统
Public Const WH_JOURNALPLAYBACK = 1 '将所记载的消息进行回放 系统
Public Const WH_JOURNALRECORD = 0 '监视并记录输入消息 系统
Public Const WH_KEYBOARD = 2 '键盘消息 线程或系统
Public Const WH_MOUSE = 7  '鼠标消息 线程或系统
Public Const WH_MSGFILTER = -1  '菜单滚动条、对话框消息 线程或系统
Public Const WH_SHELL = 10  '外壳程序的消息 线程或系统
Public Const WH_SYSMSGFILTER = 6 '所有线程的菜单滚动条、对话框消息系统
Public Const WH_HARDWARE = 8Public Const SC_MINIMIZE = &HF020 '最小化
Public Const SC_MAXIMIZE = &HF030 '最大化
Public Const SC_NEXTWINDOW = &HF040&
Public Const SC_PREVWINDOW = &HF050&
Public Const SC_CLOSE = &HF060    '关闭
Public Const SC_MOUSEMENU = &HF090&
Public Const SC_RESTORE = &HF120&
Public Const GWL_WNDPROC = (-4)Public Const WM_WINDOWPOSCHANGING = &H46Public Type POINT
    X As Long
    Y As Long
End Type'Msg结构定义了传递给WH_CALLWNDPROC钩子子程CallWndProc的消息参数。Public Type Msg
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINT
End TypePublic Type Rect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End TypePublic 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 Declare Function GetWindowRectA Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, lpRect As Rect) As Long '边框大小
Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadID As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Sub API_拷贝内存 Lib "kernel32.dll" Alias "RtlMoveMemory" (lpvDest As Msg, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Declare Sub CopyMemory_Long Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Dim HookMsg As Msg, OldHook As Long, OldWindowProc As Long, PosA As POINTPublic Function HookWindowSize(ByVal PID As Long) As Long
    OldHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf CallWinHookProc, GetModuleHandle(StrConv("Aniu", vbUnicode)), PID)
    HookWindowSize = OldHook
End FunctionPublic Function UnHookWindowSize() As Long
    UnHookWindowSize = IIf(UnhookWindowsHookEx(OldHook) > 0, 1, 0)
End Function
Private Function CallWinHookProc(ByVal mesage As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim ptr As Long
    Debug.Print mesage, wParam, lParam
    API_拷贝内存 HookMsg, lParam, LenB(HookMsg)
    CopyMemory_Long ptr, HookMsg.message, 4
    If ptr = 274 Then
        Select Case HookMsg.wParam
        Case SC_MINIMIZE '最小化消息
            MsgBox "窗口最小化"
            Exit Function
        Case SC_MAXIMIZE    '最大化消息
            MsgBox "窗口最大化"
            Exit Function
        Case SC_RESTORE     '窗口还原消息
            MsgBox "窗口还原"
            Exit Function
        Case SC_CLOSE       '窗口关闭消息
            MsgBox "窗口关闭"
            Exit Function
        End Select
    End If
    CallWinHookProc = CallNextHookEx(OldHook, mesage, wParam, lParam)
End FunctionPublic Function BanWindowMove(ByVal hwnd As Long) As Long
    ' OldWindowProc = GetWindowLong(hwnd, GWL_WNDPROC)
    OldWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
    BanWindowMove = IIf(OldWindowProc > 0, 1, 0)
End FunctionPublic Function EnableWindowMove(ByVal hwnd As Long) As Long
    EnableWindowMove = SetWindowLong(hwnd, GWL_WNDPROC, OldWindowProc)
End Function'窗口禁止移动
Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim wRect As Rect  '拦截窗口位置改变的消息
    MsgBox hwnd
    If uMsg = WM_WINDOWPOSCHANGING Then '窗口大小,位置,或在Z顺序发生改变时触发。
        CopyMemory PosA, ByVal lParam, Len(PosA)
        GetWindowRectA hwnd, wRect
        PosA.X = wRect.Left
        PosA.Y = wRect.Top
        CopyMemory ByVal lParam, PosA, Len(PosA)
    End If
    WindowProc = CallWindowProc(OldWindowProc, hwnd, uMsg, wParam, lParam)
End Function