There are times when you want to know not only if your user is interacting with your application but actually interacting anywhere on the computer. Especially if you are waiting for somekind of user Input. Microsoft thankfully made it easy as I found a API call on MSDN.com and I converted it from C++ to work with Visual Basic (Works for .NET, VB 2008/2010, VB 2013, and 2015). I actually have a VB 6.0 Example for doing this at my www.vbcodesource.com website. Below is the little API call…
Visual Basic 6.0
' 'The actual API call to use. Private Declare Function GetLastInputInfo Lib "user32.dll" (ByRef inputStructure As inputInfo) As Boolean ' Private Type inputInfo structSize As Long tickCount As Long End Type
Visual Basic.NET Version…
' 'The actual API call to use. Private Declare Function GetLastInputInfo Lib "user32.dll" (ByRef inputStructure As inputInfo) As Boolean ' Private Structure inputInfo Dim structSize As Int32 Dim tickCount As Int32 End Structure
Now that the APIs are out of the way, you only need to setup and use the codes. The code below will work for ALL VBs with just some minor changes…
Visual Basic 6.0
' 'The variable that will be passed to the API call and receive the activity report. Private info As inputInfo ' 'Visual Basic 5.0/6.0… Dim firstTick As Long Dim lastTick As Long
' 'The variable that will be passed to the API call and receive the activity report. Private info As inputInfo ' 'Visual Basic.NET… ' Dim firstTick As Int32 ' Dim lastTick As Int32
All I did next was use the code in a Timer control and set the Interval to 1000ms (1 Second) which will update the lblTime Label Control the Last time of day the user was active. The InputInfo structure will actually give you the tickcount for when the user was last active if you want to use that. I decided to simply get the actual time they were last active
' 'This timer will fire every 1000ms(One Second) or so displaying the last time the user was active. ' 'The size of the structure for the API call. info.structSize = Len(info) ' 'Call the API. GetLastInputInfo(info) ' 'Compare the tickcount values to determine if activity has occurred or not. If firstTick <> info.tickCount Then ' 'Display the current time of the users last activity. ' 'Change lblTime.Caption to lblTime.Text if using .NET and likewise change Time 'to Now instead. lblTime.Caption = "Last Active: " & Time ' 'Get the new tick value. firstTick = info.tickCount End If
As I mentioned already, I put that code above in a Timer control, then I set to enable and disable the timer in Two Button controls.
Now your application will know when the user was last active on the computer. But remember, just because it says they are Not active doesn’t mean that they are not reading a document, a website, or some other task that doesn’t require user input. Have fun!