Solved

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

Posted on 2008-10-16
5
1,623 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

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

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

In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

770 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