79 votes

C# - Détecter l'heure de la dernière interaction de l'utilisateur avec l'OS

J'écris une petite application de plateau qui doit détecter la dernière fois qu'un utilisateur a interagi avec sa machine pour déterminer s'il est inactif.

Existe-t-il un moyen de retrouver l'heure à laquelle un utilisateur a bougé sa souris, appuyé sur une touche ou interagi de quelque manière que ce soit avec sa machine ?

Je suppose que Windows suit ces données pour déterminer quand afficher un économiseur d'écran ou mettre hors tension, etc., donc je suppose qu'il y a une API Windows pour les récupérer moi-même ?

74voto

Matthew Flaschen Points 131723

GetLastInputInfo . Documenté à PInvoke.net .

7 votes

+1 pour PInvoke.net - Je ne connaissais pas cette ressource jusqu'à maintenant.

2 votes

Ne fonctionne pas pour les écrans tactiles sans activité de souris et de clavier

54voto

Incluent les espaces de noms suivants

using System;
using System.Runtime.InteropServices;

et ensuite 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 tickcount en temps, vous pouvez utiliser

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

Remarque. Cette routine utilise le terme TickCount mais les valeurs sont en millisecondes et ne sont donc pas les mêmes que les Ticks.

En Article de MSDN sur Environment.TickCount

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

20 votes

Vous obtenez le temps d'inactivité en millisecondes, pas en ticks.

1 votes

Comme l'a mentionné Kennyzx, la façon correcte d'obtenir le temps de séjour est la suivante TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

0 votes

Lorsque je crée une classe, je ne peux pas obtenir d'objets hors de la classe pour leur attribuer une valeur. Pouvez-vous afficher un exemple de la façon dont vous utiliseriez ceci après avoir instancié la classe ?

0voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X