块中的 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 Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_USER = &H400 Public Const GWL_WNDPROC = (-4) Private OldWndProc As Long Public Const WM_MYMESSAGE = WM_USER + 1 '自定义的消息一定要比WM_USER大,不然就会和Windows原有的消息重复的 Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_MYMESSAGE Then Debug.Print "自定义消息!" Exit Function End If WindowProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam) End Function
Public Sub HookWindow(hwnd As Long) OldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub
Public Sub UnHook(hwnd As Long) SetWindowLong hwnd, GWL_WNDPROC, OldWndProc End Sub
'窗体的 Private Sub Command1_Click() SendMessage Me.hwnd, WM_MYMESSAGE, ByVal 0&, ByVal 0& End Sub
Private Sub Form_Load() HookWindow Me.hwnd End Sub
Private Sub Form_Unload(Cancel As Integer) UnHook Me.hwnd End Sub
用timer检测,其实不是消息,是程序内部定义的变量吧,变量发生变化,触发某个函数
二种方式
用windows消息,好像支持的消息不对,都对应着event
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 Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_USER = &H400
Public Const GWL_WNDPROC = (-4)
Private OldWndProc As Long
Public Const WM_MYMESSAGE = WM_USER + 1 '自定义的消息一定要比WM_USER大,不然就会和Windows原有的消息重复的
Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MYMESSAGE Then
Debug.Print "自定义消息!"
Exit Function
End If
WindowProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
End Function
Public Sub HookWindow(hwnd As Long)
OldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHook(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, OldWndProc
End Sub
'窗体的
Private Sub Command1_Click()
SendMessage Me.hwnd, WM_MYMESSAGE, ByVal 0&, ByVal 0&
End Sub
Private Sub Form_Load()
HookWindow Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHook Me.hwnd
End Sub
SetTimer
KillTimer