We've had a similar need for our software... it's a WPF application as well, and as a security feature - a client can configure a time that their user's will be logged off if they are idle.
Below is the class that I made to wrap the Idle Detection code (which utilizes built in Windows functionality).
We simply have a timer tick ever 1 second to check if the idle time is greater than the specified threshold ... takes 0 CPU.
First, here's how to use the code:
var idleTime = IdleTimeDetector.GetIdleTimeInfo();
if (idleTime.IdleTime.TotalMinutes >= 5)
{
// They are idle!
}
You can use this and also make sure that your WPF full screened app is "focused" to achieve your needs:
using System;
using System.Runtime.InteropServices;
namespace BlahBlah
{
public static class IdleTimeDetector
{
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static IdleTimeInfo GetIdleTimeInfo()
{
int systemUptime = Environment.TickCount,
lastInputTicks = 0,
idleTicks = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
if (GetLastInputInfo(ref lastInputInfo))
{
lastInputTicks = (int)lastInputInfo.dwTime;
idleTicks = systemUptime - lastInputTicks;
}
return new IdleTimeInfo
{
LastInputTime = DateTime.Now.AddMilliseconds(-1 * idleTicks),
IdleTime = new TimeSpan(0, 0, 0, 0, idleTicks),
SystemUptimeMilliseconds = systemUptime,
};
}
}
public class IdleTimeInfo
{
public DateTime LastInputTime { get; internal set; }
public TimeSpan IdleTime { get; internal set; }
public int SystemUptimeMilliseconds { get; internal set; }
}
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…