web-dev-qa-db-fra.com

C # - Détecte l'heure de la dernière interaction de l'utilisateur avec le système d'exploitation

J'écris une petite application de bac 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 avec sa machine d'une manière ou d'une autre

Je suppose 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 permettant de le récupérer moi-même?

57
GenericTypeTea

GetLastInputInfo . Documenté à PInvoke.net .

63
Matthew Flaschen

inclure les espaces de noms suivants

using System;
using System.Runtime.InteropServices;

et ensuite inclure ce qui suit

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. 

From Article MSDN sur Environment.TickCount

Obtient le nombre de millisecondes écoulées depuis le démarrage du système.

33

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;
    }