C # - Détecte l'heure de la dernière interaction de l'utilisateur avec le système d'exploitation
-
10-07-2019 - |
Question
Je suis en train d’écrire une petite application qui doit détecter la dernière fois qu’un utilisateur a interagi avec son ordinateur pour déterminer s’il est inactif.
Existe-t-il un moyen de récupérer l'heure à laquelle un utilisateur a déplacé sa souris, appuyé sur une touche ou interagi de quelque manière que ce soit avec sa machine?
Je pense que Windows suit évidemment ce problème pour déterminer quand afficher un écran de veille, une mise hors tension, etc., alors je suppose qu'il existe une API Windows pour le récupérer moi-même?
La solution
ObtenirLastInputInfo . Documenté à l'adresse PInvoke.net .
Autres conseils
inclure les espaces de noms suivants
using System;
using System.Runtime.InteropServices;
puis inclure les éléments suivants
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
/// <summary>
/// Helps to find the idle time, (in milliseconds) spent since the last user input
/// </summary>
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);
}
/// <summary>
/// Get the Last input time in milliseconds
/// </summary>
/// <returns></returns>
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;
}
}
Pour convertir le nombre de ticks en temps, vous pouvez utiliser
TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);
Remarque. Cette routine utilise le terme TickCount mais les valeurs sont exprimées en millisecondes et ne sont donc pas identiques aux ticks.
De Article MSDN sur Environment.TickCount
Obtient le nombre de millisecondes écoulées depuis le démarrage du système.
Code:
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;
}