Attribute VB_Name = "modFormFocus" Option Explicit 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 Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const WM_ACTIVATEAPP = &H1C Private Const GWL_WNDPROC = -4 Private lOldWndProc As Long Private mForm As Object Public Sub Hook(Form As Object) If (TypeOf Form Is Form) And (mForm Is Nothing) Then Set mForm = Form If Not (mForm Is Nothing) Then lOldWndProc = SetWindowLong(mForm.hWnd, GWL_WNDPROC, AddressOf WindowProc) End If End Sub Public Sub Unhook() If Not (mForm Is Nothing) Then Call SetWindowLong(mForm.hWnd, GWL_WNDPROC, lOldWndProc) End Sub Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg = WM_ACTIVATEAPP Then On Error Resume Next ' In case one or both of these methods are not implemented If wParam = 0 Then mForm.FormLostFocus Else mForm.FormGotFocus End If End If WindowProc = CallWindowProc(lOldWndProc, hWnd, uMsg, wParam, lParam) End Function