INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Jobs

Access Howto:

Automatically logging out idle users by nashman
Posted: 8 Jan 02

Hi Gang,

Here is an easy way to force logout an idle dBase user. The confusion seems to be around " How to determine user is idle ". The easy way around this is to have the database automatically check at regular intervals the name of the active control, compare this name with the name of the previously stored active control. If the names are different, then reset the clock to 0, if it is still the same name after the set timeout period, alert the user and log the user off. Here is how you would accomplish this.

Step 1-

-Create a form named DetectIdleTime
-Place this code in the form's On Timer event...

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

         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


Sub IdleTimeDetected(ExpiredMinutes)
         'Dim Msg As String
         'Msg = "No user activity detected in the last "
         'Msg = Msg & ExpiredMinutes & " minute(s)!"
         'MsgBox Msg, 48
         
         DoCmd.OpenForm "frm_ExitNonUse"
         
      End Sub


I have the Timer Interval at 5000 which means the form checks the control status every 5 seconds and sends a warning after 15 minutes idle time. Feel free to change this to what best suits your application. Once this form detects that idle time has been reached, it launches a warning form...


Step 2-

-Create a new form named frm_ExitNonUse. Insert a Label field on the form with the following message in large bold red font on yellow form background...a real attention getter if you know what I mean..."This application will automatically close in 5 minutes due to non-use. To reset timer, simply close this form."

-Insert a command button labelled "OK" named cmdOK and place this code in the button's On Click event procedure

Private Sub cmdOK_Click()
On Error GoTo Err_cmdOK_Click


    DoCmd.Close

Exit_cmdOK_Click:
    Exit Sub

Err_cmdOK_Click:
    MsgBox Err.Description
    Resume Exit_cmdOK_Click
    
End Sub


-Set this form's Timer Interval to 5000 to again every 5 seconds check the active control.

-Place this code in the On Timer event procedure...


Private 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

Sub IdleTimeDetected(ExpiredMinutes)
         'Dim Msg As String
         'Msg = "No user activity detected in the last "
         'Msg = Msg & ExpiredMinutes & " minute(s)!"
         'MsgBox Msg, 48
         
         Application.Quit acSaveYes
         
      End Sub


Step 4-

-Create a macro named AutoExec(this will automatically execute when the database is open) with the following properties...

Action - Select "OpenForm"
Form Name - enter "DetectIdleTime" without quotes
View - Form
Data Mode - Edit
Window Mode - Hidden


Here is what will happen...

1-On open database, the AutoExec macro will execute openning the form named "DetectIdleTime" in hidden mode.

2-This form has a built in event timer that checks the name of the active control every 5 seconds and saves that name for future comparison.

3-Every 5 seconds, if the active control has not changed, it increments the timer by the elapsed time until the total elapsed time equals IDLEMINUTES or 15 minutes in this case.

4-If the active control name has changed, that is, the user has changed focus of the active control, the timer is reset to 0

5-If 15 minutes of idle time have passed, the hidden form opens another form that warns the user that the database will close in this case in 5 minutes, then resets the timer.

6-The newly opened form has its own timer counting down to 5 minutes doing the same 5 second checks on the active control name. If no activity, the database closes automatically.

You can change the idletime settings to match your needs as required.

Hope this helps.
nashman

Back to Microsoft: Access Other topics FAQ Index
Back to Microsoft: Access Other topics Forum

My Archive

Resources

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close