有啊
HOOK
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const WM_ACTIVATE = &H6
Public Const GWL_WNDPROC = (-4)
FORM_LOAD时
prevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)FORM_UNLOAD时
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
If Msg = WM_ACTIVATE Then
If wParam = 0 Then
MainForm.Caption = "失去焦点"
Else
MaiForm.Caption = "得到焦点"
End If
End If
End Function
HOOK
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const WM_ACTIVATE = &H6
Public Const GWL_WNDPROC = (-4)
FORM_LOAD时
prevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)FORM_UNLOAD时
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
If Msg = WM_ACTIVATE Then
If wParam = 0 Then
MainForm.Caption = "失去焦点"
Else
MaiForm.Caption = "得到焦点"
End If
End If
End Function
丢了一个函数声明
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
用HOOK的时候调试要万分小心,否则就会非法操作
因为在那个时候IDE是最顶层的父,一不小心就会对它有影响
VB在设计的时候就没准备这个
不过编译之后就不会有这个问题
前提是FORM_UNLOAD的时候要把以前的窗口处理函数赋回去
Select Case uMsg
'加入对WM_NCACTIVATE消息的处理
Case WM_NCACTIVATE
bActive = False
Case WM_ACTIVATE
bActive = True
Case Else
MyWindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select