WPF inactivity and activity

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
        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;

Leave a Comment