it-swarm.com.de

C # - Ermittlungszeitpunkt der letzten Benutzerinteraktion mit dem Betriebssystem

Ich schreibe eine kleine Tray-Anwendung, die das letzte Mal erkennen muss, wenn ein Benutzer mit seinem Computer interagiert, um festzustellen, ob er sich im Leerlauf befindet.

Gibt es eine Möglichkeit, den Zeitpunkt abzurufen, zu dem der Benutzer zuletzt die Maus bewegt, eine Taste gedrückt oder auf irgendeine Weise mit dem Computer interagiert hat?

Ich schätze, Windows verfolgt dies offensichtlich, um zu bestimmen, wann ein Bildschirmschoner oder ein Stromausfall usw. angezeigt werden soll.

57
GenericTypeTea

GetLastInputInfo . Dokumentiert unter PInvoke.net .

63

schließen Sie folgende Namespaces ein

using System;
using System.Runtime.InteropServices;

und dann folgendes hinzufügen

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

Um den Tickcount in Zeit umzuwandeln, können Sie verwenden 

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

Hinweis. Diese Routine verwendet den Begriff "TickCount", aber die Werte sind in Millisekunden angegeben und unterscheiden sich nicht in Ticks. 

Aus dem MSDN-Artikel zu Environment.TickCount

Ruft die Anzahl der Millisekunden ab, die seit dem Systemstart vergangen sind.

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