How to: Detect User Idle Time or Inactivity

Access Developer Reference

This topic shows how to create a procedure that will run if your Microsoft Access application does not detect any user input for a specified period of time. It involves creating a hidden form, DetectIdleTime, which keeps track of idle time.

Follow these steps to create the DetectIdleTime form.

  1. Create a blank form that is not based on any table or query and name it DetectIdleTime.
  2. Set the following form properties:
    Property Value
    OnTimer [Event Procedure]
    TimerInterval 1000
    Bb243861.vs_note(en-us,office.12).gif  Note
    The TimerInterval setting indicates how often (in milliseconds) the application checks for user inactivity. A setting of 1000 equals 1 second.
  3. Enter the following code for the OnTimer property event procedure:
    
    

    Sub Form_Timer() ' IDLEMINUTES determines how much idle time to wait for before ' running the IdleTimeDetected subroutine. Const IDLEMINUTES = 5

         Static PrevControlName As String
         Static PrevFormName As String
         Static ExpiredTime
    
         Dim ActiveFormName As String
         Dim ActiveControlName As String
         Dim ExpiredMinutes
    
         On Error Resume Next
    
         ' Get the active form and control name.
    
         ActiveFormName = Screen.ActiveForm.Name
         If Err Then
            ActiveFormName = "No Active Form"
            Err = 0
         End If
    
         ActiveControlName = Screen.ActiveControl.Name
            If Err Then
            ActiveControlName = "No Active Control"
            Err = 0
         End If
    
         ' Record the current active names and reset ExpiredTime if:
         '    1. They have not been recorded yet (code is running
         '       for the first time).
         '    2. The previous names are different than the current ones
         '       (the user has done something different during the timer
         '        interval).
         If (PrevControlName = "") Or (PrevFormName = "") _
           Or (ActiveFormName <> PrevFormName) _
           Or (ActiveControlName <> PrevControlName) Then
            PrevControlName = ActiveControlName
            PrevFormName = ActiveFormName
            ExpiredTime = 0
         Else
            ' ...otherwise the user was idle during the time interval, so
            ' increment the total expired time.
            ExpiredTime = ExpiredTime + Me.TimerInterval
         End If
    
         ' Does the total expired time exceed the IDLEMINUTES?
         ExpiredMinutes = (ExpiredTime / 1000) / 60
         If ExpiredMinutes >= IDLEMINUTES Then
            ' ...if so, then reset the expired time to zero...
            ExpiredTime = 0
            ' ...and call the IdleTimeDetected subroutine.
            IdleTimeDetected ExpiredMinutes
         End If
      End Sub</code>
    
    4. Create the following procedure in the form module:
            Sub IdleTimeDetected(ExpiredMinutes)
             Dim Msg As String
             Msg = "No user activity detected in the last "
             Msg = Msg & ExpiredMinutes & " minute(s)!"
             MsgBox Msg, 48
          End Sub
    

    To hide the DetectIdleTime form as it opens, set the WindowMode argument of the OpenForm method to acHidden.