Click here to Skip to main content
13,292,376 members (59,579 online)
Click here to Skip to main content
Add your own
alternative version


69 bookmarked
Posted 10 Mar 2006

Getting the user idle time with C#

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

Sample Image


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

BOOLBoolean variable (should be TRUE or FALSE).
BOOLEANBoolean variable (should be TRUE or FALSE).
BYTEByte (8 bits).
CALLBACKCalling convention for callback functions.
CHAR8-bit Windows (ANSI) character.
COLORREFRed, green, blue (RGB) color value (32 bits).
CONSTVariable whose value is to remain constant during execution.
DWORD32-bit unsigned integer.
DWORD_PTRUnsigned 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.)
INT32-bit signed integer.
INT_PTRSigned integral type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic.
INT3232-bit signed integer.
INT6464-bit signed integer.
LONG32-bit signed integer.
LONG_PTRSigned long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic.
LONG3232-bit signed integer.
LONG6464-bit signed integer.
LONGLONG64-bit signed integer.
LPARAMMessage parameter.
LPBOOLPointer to a BOOL.
LPBYTEPointer to a BYTE.

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

lastInPut.cbSize = (uint)

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.


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


About the Author

Web Developer
Costa Rica Costa Rica
No Biography provided

You may also be interested in...


Comments and Discussions

GeneralMy vote of 5 Pin
andoniu1-Nov-11 22:53
memberandoniu1-Nov-11 22:53 

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

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

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.171207.1 | Last Updated 10 Mar 2006
Article Copyright 2006 by Xavi23cr
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid