Click here to Skip to main content
11,572,251 members (73,567 online)
Click here to Skip to main content

Getting the user idle time with C#

, 10 Mar 2006 136.6K 5.1K 67
Rate this:
Please Sign up or sign in to vote.
Getting the user idle time using C# and the Windows API.

Sample Image

Introduction

System idle time is the time that has passed since the computer has received its last input from the user. It can be used to detect whether the user is idle or not. This feature is present in many instant messaging systems.

Visual Studio 2003 does not provide an explicit way to accomplish this, but I found an alternate method using C# code only.

Using the code

The implemented solution calls functions inside the user32.dll and kernel32.dll files.

To do this, it is necessary:

  1. To add a reference to the System.Runtime.InteropServices namespace.
  2. To know the name and definition of the function to be called.
  3. To create an extern function using C#.
  4. To make any additional structure to be used in the called functions.
// Step 1
using System.Runtime.InteropServices;

// Steps 2 and 3
[DllImport("User32.dll")]
private static extern bool 
        GetLastInputInfo(ref LASTINPUTINFO plii);

//Step 4
internal struct LASTINPUTINFO 
{
    public uint cbSize;

    public uint dwTime;
}

When I was trying to make things works, I found an issue with the LASTINPUTINFO structure. I solved the problem by creating a C# struct with the same members as the original function. Note that you need to know the mapping between a Windows data type and the .NET Framework data types. The following table is very useful:

BOOL Boolean variable (should be TRUE or FALSE).
BOOLEAN Boolean variable (should be TRUE or FALSE).
BYTE Byte (8 bits).
CALLBACK Calling convention for callback functions.
CHAR 8-bit Windows (ANSI) character.
COLORREF Red, green, blue (RGB) color value (32 bits).
CONST Variable whose value is to remain constant during execution.
DWORD 32-bit unsigned integer.
DWORD_PTR Unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows.)
INT 32-bit signed integer.
INT_PTR Signed integral type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic.
INT32 32-bit signed integer.
INT64 64-bit signed integer.
LONG 32-bit signed integer.
LONG_PTR Signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic.
LONG32 32-bit signed integer.
LONG64 64-bit signed integer.
LONGLONG 64-bit signed integer.
LPARAM Message parameter.
LPBOOL Pointer to a BOOL.
LPBYTE Pointer to a BYTE.

When using a struct as a parameter, you have to initialize it before it is passed to the function:

LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)
  System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);

The rest of the code does not contain any trick.

Using the code

The best method to use the code is compiling it in an DLL and using the functions asynchronously using a timer or threads.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Xavi23cr
Web Developer
Costa Rica Costa Rica
No Biography provided

You may also be interested in...

Comments and Discussions

 
GeneralMy vote of 5 Pin
Member 856175414-Aug-14 2:17
memberMember 856175414-Aug-14 2:17 
SuggestionGetLastInputInfo additional info Pin
jorge_toriz16-Jun-14 7:39
memberjorge_toriz16-Jun-14 7:39 
BugBUG FOUND & FIXED: Environment.TickCount returns negative value in GetIdleTime() Windows 7 X64 Pin
jeffsdjfhj321-Jun-13 3:01
memberjeffsdjfhj321-Jun-13 3:01 
GeneralRe: BUG FOUND & FIXED: Environment.TickCount returns negative value in GetIdleTime() Windows 7 X64 Pin
sihirbazz10-Jun-14 8:58
membersihirbazz10-Jun-14 8:58 
GeneralRe: BUG FOUND & FIXED: Environment.TickCount returns negative value in GetIdleTime() Windows 7 X64 Pin
Dasiths17-May-15 14:26
memberDasiths17-May-15 14:26 
GeneralMy vote of 4 Pin
Jorge Ali Urbina16-Mar-13 7:36
memberJorge Ali Urbina16-Mar-13 7:36 
GeneralMy vote of 5 Pin
Supriya Srivastav11-Jan-12 21:50
memberSupriya Srivastav11-Jan-12 21:50 
GeneralMy vote of 5 Pin
andoniu1-Nov-11 21:53
memberandoniu1-Nov-11 21:53 
QuestionWorking in 64 bit Windows Pin
eduardo zola24-Jul-11 15:28
membereduardo zola24-Jul-11 15:28 
GeneralMy vote of 5 Pin
That's Aragon21-Jul-11 2:47
memberThat's Aragon21-Jul-11 2:47 
Generalthx Pin
binabic6-May-11 10:49
memberbinabic6-May-11 10:49 
GeneralMy vote of 5 Pin
Gilberto Alexandre16-Feb-11 23:33
memberGilberto Alexandre16-Feb-11 23:33 
QuestionIs it possible in Web forms? Pin
deja_anbu12-Feb-11 22:31
memberdeja_anbu12-Feb-11 22:31 
GeneralBehave really bad on vista Pin
Sergejack27-Jan-10 5:17
memberSergejack27-Jan-10 5:17 
GeneralRe: Behave really bad on vista Pin
tiuk3-Jun-10 6:33
membertiuk3-Jun-10 6:33 
GeneralGetting the idle time of another system in network Pin
SHRIDHAR TL14-Oct-09 2:37
memberSHRIDHAR TL14-Oct-09 2:37 
GeneralRe: Getting the idle time of another system in network Pin
Andrew Orange17-Dec-09 18:56
memberAndrew Orange17-Dec-09 18:56 
GeneralPretty slick Pin
Mythos724-Aug-09 9:29
memberMythos724-Aug-09 9:29 
GeneralVirtual machine Issues Pin
snorkie16-Apr-09 12:07
membersnorkie16-Apr-09 12:07 
AnswerThis little piece of code saved me this morning Pin
German Sosa11-Apr-09 4:35
memberGerman Sosa11-Apr-09 4:35 
GeneralFantastic Pin
z00z07-Oct-08 7:04
memberz00z07-Oct-08 7:04 
Generalwell done Pin
alexandru robert, agrapine6-Jun-08 23:16
memberalexandru robert, agrapine6-Jun-08 23:16 
it works like a charm
Generalabsolutely great! Pin
Luis Miguel Silva16-Feb-08 12:46
memberLuis Miguel Silva16-Feb-08 12:46 
GeneralLicense Pin
Greg Campbell9-Jan-08 12:20
memberGreg Campbell9-Jan-08 12:20 
QuestionGetIdleTime Pin
segusmitha25-Sep-07 2:13
membersegusmitha25-Sep-07 2:13 
AnswerRe: GetIdleTime Pin
Xavi23cr25-Sep-07 3:08
memberXavi23cr25-Sep-07 3:08 
GeneralBless you! Pin
Boaz Cohen19-Aug-07 10:40
memberBoaz Cohen19-Aug-07 10:40 
QuestionTotal idle time? Pin
id10t7-Feb-07 9:28
memberid10t7-Feb-07 9:28 
QuestionHave I misundertood the whole thing? Pin
palei13-Dec-06 2:43
memberpalei13-Dec-06 2:43 
AnswerRe: Have I misundertood the whole thing? Pin
tiuk3-Jun-10 6:34
membertiuk3-Jun-10 6:34 
Generalapplication inactivity Pin
Higgs9619-Sep-06 6:55
memberHiggs9619-Sep-06 6:55 
GeneralApplication Idle Pin
daDude14-Mar-06 7:31
memberdaDude14-Mar-06 7:31 
GeneralRe: Application Idle Pin
daDude14-Mar-06 7:33
memberdaDude14-Mar-06 7:33 
GeneralRe: Application Idle Pin
mwdiablo18-Apr-06 10:46
membermwdiablo18-Apr-06 10:46 
GeneralRe: Application Idle Pin
daDude18-Apr-06 14:54
memberdaDude18-Apr-06 14:54 
GeneralApplication Idle Pin
daDude14-Mar-06 7:31
memberdaDude14-Mar-06 7:31 
QuestionMouse and keyboard? Pin
Drew Noakes14-Mar-06 6:31
memberDrew Noakes14-Mar-06 6:31 
AnswerRe: Mouse and keyboard? Pin
Xavi23cr14-Mar-06 9:09
memberXavi23cr14-Mar-06 9:09 
GeneralOnly Windows 2000 and later Pin
Marqs13-Mar-06 22:10
memberMarqs13-Mar-06 22:10 
Generalvery useful Pin
xsummerx11-Mar-06 23:21
memberxsummerx11-Mar-06 23:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150624.2 | Last Updated 10 Mar 2006
Article Copyright 2006 by Xavi23cr
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid