C# – определение времени последнего взаимодействия пользователя с ОС
-
10-07-2019 - |
Вопрос
Я пишу небольшое приложение для лотка, которое должно определять, когда пользователь в последний раз взаимодействовал со своим компьютером, чтобы определить, простаивает ли он.
Есть ли способ узнать время, когда пользователь в последний раз перемещал мышь, нажимал клавишу или каким-либо образом взаимодействовал со своим компьютером?
Я полагаю, что Windows, очевидно, отслеживает это, чтобы определить, когда отображать заставку, выключать питание и т. д., поэтому я предполагаю, что есть Windows API для получения этого самостоятельно?
Решение
GetLastInputInfo . Документально подтвержден на PInvoke.net .
Другие советы
включить следующие пространства имен
using System;
using System.Runtime.InteropServices;
а затем включите следующее
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;
}
}
Чтобы преобразовать количество тиков во время, вы можете использовать
TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);
Примечание.В этой процедуре используется термин TickCount, но значения указаны в миллисекундах и поэтому не совпадают с Ticks.
От Статья MSDN о Environment.TickCount
Получает количество миллисекунд, прошедших с момента запуска системы.
Код:
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;
}