How to track a user's idle time in a VB.NET application

Posted on 2008-10-16
Last Modified: 2013-12-17
Does anyone know of a way to track a users idle time in a .Net application. A sample in VB.NET or C# would be great.  We have a need to make an application either close or become partially unresponsive if a certain amount of time has passed. It needs to be application wide not just a form. We have tried the stopwatch and timer controls with marginal success. All samples we have seen so far are form specific or mention ASP.NET.  We would prefer not to use API calls to do this but if nothing else can be done then perhaps that will be the solution.

Using: Visual Studio 2005, VB.NET,  Framework 2.0, XP Pro
Question by:Stevejdl
LVL 22

Expert Comment

ID: 22736906
Hi there,
You will find a complete example here

Good luck
LVL 85

Accepted Solution

Mike Tomlinson earned 500 total points
ID: 22737415
Here is a completely .Net, managed code, application wide implementation that closes the app if no activity has occurred in the last 10 minutes:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Application.AddMessageFilter(New MyFilter)

    End Sub

    Private Class MyFilter

        Implements IMessageFilter

        Private Const WM_LBUTTONDOWN As Integer = &H201

        Private Const WM_LBUTTONUP As Integer = &H202

        Private Const WM_LBUTTONDBLCLK As Integer = &H203

        Private Const WM_RBUTTONDOWN As Integer = &H204

        Private Const WM_RBUTTONUP As Integer = &H205

        Private Const WM_RBUTTONDBLCLK As Integer = &H206

        Private Const WM_MBUTTONDOWN As Integer = &H207

        Private Const WM_MBUTTONUP As Integer = &H208

        Private Const WM_MBUTTONDBLCLK As Integer = &H209

        Private Const WM_MOUSEWHEEL As Integer = &H20A

        Private Const WM_KEYDOWN As Integer = &H100

        Private Const WM_KEYUP As Integer = &H101

        Private Const WM_SYSKEYDOWN As Integer = &H104

        Private Const WM_SYSKEYUP As Integer = &H105

        Private IdleTimeInMinutes As Integer = 10

        Private WithEvents tmr As System.Timers.Timer

        Private TargetDateTime As DateTime

        Public Sub New()

            TargetDateTime = DateTime.Now.AddMinutes(IdleTimeInMinutes)

            tmr = New System.Timers.Timer

            tmr.Interval = 1000


        End Sub

        Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage

            Select Case m.Msg





                    TargetDateTime = DateTime.Now.AddMinutes(IdleTimeInMinutes)

            End Select

        End Function

        Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed

            If TargetDateTime.Subtract(DateTime.Now).TotalMilliseconds < 0 Then



            End If

        End Sub

    End Class

End Class

Open in new window


Author Closing Comment

ID: 31506997
The only change made was to add a new constant:  Private Const WM_MOUSEMOVE As Integer = &H200. It was then placed at the beginning of the case statement. We wanted the app to be as responsive as the Windows screen saver.
Actually both solutions given were great but the one using managed code was preferred. Note: the other was on codeproject -
Thanks again

LVL 85

Expert Comment

by:Mike Tomlinson
ID: 22746919
WM_MOUSEMOVE is often a controversial choice for "idle activity" routines.

It is possible for the user to be interacting with OTHER applications and simply move the mouse across your application without actually interacting with it.  Should that still be considered activity for your app?  Some say yes, others no.  The user is obviously using the computer but the mouse activity may not be intended for your particular app...

Also, I found that on my system I was getting intermittent WM_MOUSEMOVE messages sent to my application by something occuring outside my application...even when the mouse wasn't being moved.  I've never figured out what causes it so I removed it from my filter since it was causing my app to never idle time out.  I'm running VB.Net 2005 Express on a WinXP Pro system.

Glad the code was helpful to you though.  =)


Expert Comment

ID: 39500786
Well...I'm using this routine and having a problem trying to display a Form. Here is the code below as well as the error.

            Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed
            If TargetDateTime.Subtract(DateTime.Now).TotalMilliseconds < 0 Then
                frmMain.Enabled = False
            End If
        End Sub

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (…
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor ( If you're looking for how to monitor bandwidth using netflow or packet s…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now