[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
<DllImport("user32.dll")>
Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function
[DllImport("user32.dll")]
static bool GetLastInputInfo(LASTINPUTINFO* plii);
[<Struct; CLIMutable; StructLayout(LayoutKind.Sequential)>]
type LastInputInfo = {
size : int
dwTime : uint32
}
[<DllImport("user32")>]
extern int GetLastInputInfo(LastInputInfo& lpi);
Very useful to detect user-idle state of an application.
Minimum operating systems: Windows 2000
Compare to Environment.TickCount to get the time since the last user input.
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);
}
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
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 );
}
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.
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
Do you know one? Please contribute it!