我正在编写一个小型任务栏应用程序,该应用程序需要检测用户上次与计算机交互的时间,以确定他们是否空闲。
是否有任何方法可以检索用户上一次移动鼠标,敲击键或与计算机进行任何交互的时间?
我认为Windows很明显会对此进行跟踪,以确定何时显示屏幕保护程序或关闭电源等,因此我假设有一个Windows API可以自己检索此屏幕?
Answers:
包括以下名称空间
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的文章
获取自系统启动以来经过的毫秒数。
TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);
码:
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;
}