Detecting when another application is activated

WM_ACTIVATE detection sample

In a form, there is a Deactivate event. Exactly what this method is for is hard to determine, because it hardly ever seems to fire. Ok, that's perhaps a little unfair - it never fires. One thing you certainly can't detect without a bit of additional work is when the user Alt-Tabs to another application. Detecting this can be useful, for example, when you the user is performing a drag or you're showing a pop-up tool window.

Detecting Activation and Deactivation

When a form in your application is activated or deactivated, Windows fires a WM_ACTIVATE message to the form. The wParam of this message tells you the reason the message has been fired:

  • 0 - Form deactivated
  • 1 - Form activated
  • 2 - Form activated by a mouse click

The code to make this work is very simple with the Subclassing and Timer assistant:

' Subclassing object to catch Alt-Tab 
Implements ISubclass 
Private Const WM_ACTIVATE = &H6 

Private Sub Form_Load() 
    ' Start subclassing for WM_ACTIVATE 
    AttachMessage Me, Me.hwnd, WM_ACTIVATE 
End Sub 

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
    ' Clear up: 
    DetachMessage Me, Me.hwnd, WM_ACTIVATE 
End Sub 

Private Property Let ISubclass_MsgResponse(ByVal RHS As EMsgResponse) 
    ' NR 
End Property 

Private Property Get ISubclass_MsgResponse() As EMsgResponse 
    ' Respond to the message after windows has done its stuff: 
    ISubclass_MsgResponse = emrPreprocess 
End Property 

Private Function ISubclass_WindowProc( _
    ByVal hwnd As Long, _
    ByVal iMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long _
    ) As Long 

    Select Case wParam 
    Case 0 
        Me.Caption = "Deactivate" 
    Case 1 
        Me.Caption = "Activate" 
    Case 2 
        Me.Caption = "Mouse Activate" 
    End Select 

End Function