Solved

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

Posted on 2008-10-16
5
1,594 Views
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
0
Comment
Question by:Stevejdl
5 Comments
 
LVL 22

Expert Comment

by:RedKelvin
ID: 22736906
Hi there,
You will find a complete example here
http://www.codeproject.com/KB/system/SystemIdleTimerComponent.aspx

Good luck
RedK
0
 
LVL 85

Accepted Solution

by:
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

            tmr.Start()

        End Sub
 

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

            Select Case m.Msg

                Case WM_MOUSEWHEEL, WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, _

                        WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, _

                        WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK, _

                        WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK
 

                    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

                tmr.Stop()

                Application.Exit()

            End If

        End Sub
 

    End Class
 

End Class

Open in new window

0
 

Author Closing Comment

by:Stevejdl
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 - http://www.codeproject.com/KB/system/SystemIdleTimerComponent.aspx
Thanks again

0
 
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.  =)


0
 

Expert Comment

by:BlakeMcKenna
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
                frmLogin.ShowDialog()
                frmMain.Enabled = False
                frmLogin.ShowDialog(frmMain)
            End If
        End Sub
screenshot.jpg
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
Migrating to Microsoft Office 365 is becoming increasingly popular for organizations both large and small. If you have made the leap to Microsoft’s cloud platform, you know that you will need to create a corporate email signature for your Office 365…
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…

896 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

15 Experts available now in Live!

Get 1:1 Help Now