C # – Detecta el tiempo de la última interacción del usuario con el sistema operativo

Estoy escribiendo una pequeña aplicación de bandeja que necesita detectar la última vez que un usuario interactuó con su máquina para determinar si están inactivos.

¿Hay alguna manera de recuperar el momento en que un usuario movió su mouse por última vez, presionó una tecla o interactuó de alguna manera con su máquina?

Me imagino que Windows obviamente rastrea esto para determinar cuándo mostrar un protector de pantalla o apagado, etc., así que supongo que hay una API de Windows para recuperarlo yo mismo.

GetLastInputInfo . Documentado en PInvoke.net .

incluir los siguientes espacios de nombres

using System; using System.Runtime.InteropServices; 

y luego incluir siguiente

 internal struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } ///  /// Helps to find the idle time, (in milliseconds) spent since the last user input ///  public class IdleTimeFinder { [DllImport("User32.dll")] private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [DllImport("Kernel32.dll")] private static extern uint GetLastError(); public static uint GetIdleTime() { LASTINPUTINFO lastInPut = new LASTINPUTINFO(); lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut); GetLastInputInfo(ref lastInPut); return ((uint)Environment.TickCount - lastInPut.dwTime); } ///  /// Get the Last input time in milliseconds ///  ///  public static long GetLastInputTime() { LASTINPUTINFO lastInPut = new LASTINPUTINFO(); lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut); if (!GetLastInputInfo(ref lastInPut)) { throw new Exception(GetLastError().ToString()); } return lastInPut.dwTime; } } 

Para convertir el tickcount en tiempo, puede usar

 TimeSpan timespent = TimeSpan.FromMilliseconds(ticks); 

Nota. Esta rutina usa el término TickCount, pero los valores están en milisegundos y no son lo mismo que Ticks.

Del artículo de MSDN sobre Environment.TickCount

Obtiene la cantidad de milisegundos transcurridos desde que se inició el sistema.

Código:

  using System; using System.Runtime.InteropServices; public static int IdleTime() //In seconds { LASTINPUTINFO lastinputinfo = new LASTINPUTINFO(); lastinputinfo.cbSize = Marshal.SizeOf(lastinputinfo); GetLastInputInfo(ref lastinputinfo); return (((Environment.TickCount & int.MaxValue) - (lastinputinfo.dwTime & int.MaxValue)) & int.MaxValue) / 1000; }