getlastinputinfo (user32)
Last changed: -70.130.76.223

.
Summary
Gets the time of the last user input (in ms since the system started)

C# Signature:

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

VB Signature:

<DllImport("user32.dll")>
Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function

C++ Signature:

[DllImport("user32.dll")]
static bool GetLastInputInfo(LASTINPUTINFO* plii);

F# Signature

   [<Struct; CLIMutable; StructLayout(LayoutKind.Sequential)>]
   type LastInputInfo = {
     size : int
     dwTime : uint32
   }

   [<DllImport("user32")>]
   extern int GetLastInputInfo(LastInputInfo& lpi);

User-Defined Types:

LASTINPUTINFO

Notes:

Very useful to detect user-idle state of an application.

Minimum operating systems: Windows 2000

Tips & Tricks:

Compare to Environment.TickCount to get the time since the last user input.

Sample Code:

These samples do not take into account the rollover of the tick counter which will occur after ~50 days of uptime.

This function retrieves the time in seconds since last user input

    static uint GetLastInputTime()
    {
        uint idleTime = 0;
        LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = (uint)Marshal.SizeOf( lastInputInfo );
        lastInputInfo.dwTime = 0;

        uint envTicks = (uint)Environment.TickCount;

        if ( GetLastInputInfo( ref lastInputInfo ) )
        {
        uint lastInputTick = lastInputInfo.dwTime;

        idleTime = envTicks - lastInputTick;
        }

        return (( idleTime > 0 ) ? ( idleTime / 1000 ) : 0);
    }

Sample Code vb.net:

This function retrieves the time in seconds since last user input

Dim idletime As Integer
Dim lastInputInf As New LASTINPUTINFO()

   Public Function GetLastInputTime() As Integer

    idletime = 0
    lastInputInf.cbSize = Marshal.SizeOf(lastInputInf)
    lastInputInf.dwTime = 0

    If GetLastInputInfo(lastInputInf) Then
        idletime = Environment.TickCount - lastInputInf.dwTime
    End If

    If idletime > 0 Then
        Return idletime / 1000
    Else : Return 0
    End If

   End Function

Sample Code C++ .net:

This function retrieves the time in seconds since last user input

public: static double getSystemIdleTime()
{                    
    int systemUptime = Environment::TickCount;
    int idleTicks = 0;
    LASTINPUTINFO lastInputInfo;
    lastInputInfo.cbSize = (UInt32)Marshal::SizeOf(lastInputInfo);
    lastInputInfo.dwTime = 0;
    if (GetLastInputInfo(&lastInputInfo))
    {        
        int lastInputTicks = (int)lastInputInfo.dwTime;
        idleTicks = systemUptime - lastInputTicks;
    }
    return (( idleTicks > 0 ) ? ( idleTicks / 1000 ) : idleTicks );
}

Sample code F#

let idleTimeSeconds() =
     let size = sizeof<LastInputInfo>
     let now = uint32 Environment.TickCount
     let mutable info = { size = size; dwTime = 0u }
     match GetLastInputInfo(&info) with
     | 0 -> 0.
     | _ -> (now - info.dwTime) / 1000.

Sample code gcc Cygwin:

Prints time in seconds since last user input.

Save to idle.c

Compile at bash command line with: gcc -Wall idle.c

Test it with: sleep 15; ./a.exe

Moving the mouse or pressing the keyboard during the test will alter the result, as expected!

#include <w32api/windef.h>
#include <w32api/winbase.h>
#include <w32api/winuser.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int systemUptime = GetTickCount();    // was Environment.TickCount
    int idleTicks = 0;

    LASTINPUTINFO lastInputInfo;
    lastInputInfo.cbSize = sizeof (lastInputInfo);
    lastInputInfo.dwTime = 0;
    if (GetLastInputInfo(&lastInputInfo)) {        
        int lastInputTicks = (int)lastInputInfo.dwTime;
        idleTicks = systemUptime - lastInputTicks;
    }
    printf("%d seconds\n", (idleTicks > 0)? idleTicks/1000: 0);
    return 0;
}

Contributed by John Refling

Alternative Managed API:

Do you know one? Please contribute it!

Documentation