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?

Était-ce utile?

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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top