Pergunta

Estou escrevendo um pequeno aplicativo de bandeja que precisa detectar a última vez que um usuário interagiu com sua máquina para determinar se está ocioso.

Existe alguma maneira de recuperar o tempo que um usuário moveu pela última vez no mouse, acertar uma chave ou interagir de alguma forma com a máquina?

Eu acho que o Windows obviamente rastreia isso para determinar quando exibir um economizador de tela ou desligamento, etc., por isso estou assumindo que há uma API do Windows para recuperar isso sozinho?

Foi útil?

Solução

GetLastInputInfo. Documentado em Pinvoke.net.

Outras dicas

Inclua os seguintes espaços para nome

using System;
using System.Runtime.InteropServices;

e depois inclua a seguinte

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

Para converter o tickCount em tempo, você pode usar

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

Observação. Essa rotina usa o termo TickCount, mas os valores estão em milissegundos e não são os mesmos que os ticks.

A partir de Artigo do MSDN sobre Environment.TickCount

Obtém o número de milissegundos decorridos desde o início do sistema.

Código:

 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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top