我是要攔截視窗最大化,最小化,位置,大小,關閉這些訊息。視窗回呼函式和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 = 8
Public 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 = &H46
Public 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 Type
Public Type Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
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
Public 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 POINT
Public Function HookWindowSize(ByVal PID As Long) As Long
OldHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf CallWinHookProc, GetModuleHandle(StrConv("Aniu", vbUnicode)), PID)
HookWindowSize = OldHook
End Function
Public 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 Function
Public 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 Function
Public 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
uj5u.com熱心網友回復:
明白了,樓主是想監視其他程式的狀態是不? 那好像得注入神馬的。要不簡單點就用Timer, 獲得外部程式的hwnd, 然后用IsZoomed、IsIconic這樣的API來判斷是否最大化或最小化了。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109521.html
標籤:API
