C# - Detectar o tempo da última interação do usuário com o sistema operacional
-
10-07-2019 - |
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?
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;
}