C# - определение времени последнего взаимодействия пользователя с ОС
Я пишу небольшое приложение для лотков, которое должно определить последний раз, когда пользователь взаимодействовал со своей машиной, чтобы определить, простаивают ли они.
есть ли способ получить время, когда пользователь в последний раз переместил свою мышь, нажал клавишу или каким-либо образом взаимодействовал со своей машиной?
Я полагаю, что Windows, очевидно, отслеживает это, чтобы определить, когда отображать экранную заставку или выключать питание и т. д., Поэтому я предполагаю, что есть API Windows для извлечения этого самостоятельно?
3 ответа:
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; } }
для преобразования tickcount во время вы можете использовать
TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);
Примечание. Эта процедура использует термин TickCount, но значения находятся в миллисекундах и поэтому не совпадают с тиками.
С статья MSDN об окружающей среде.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; }