C# – 检测上次用户与操作系统交互的时间

我正在写一个小的托盘应用程序,需要检测用户上次与他们的机器进行交互以确定它们是否空闲。

有什么方法可以检索用户上次移动鼠标,敲击键或以任何方式与其机器进行交互的时间?

我认为Windows显然跟踪这个来决定什么时候显示一个屏幕保护程序或关机等,所以我假设有一个Windows API来检索这个自己?

GetLastInputInfo 。 logging在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; }