The idle timer is the countdown after a user driven event on a Windows computer. So if your computer is set to enable a screensaver “after 5 minutes”, that “after” refers to a user driven event like moving the mouse or pressing a key.

This program simulates a user driven event to reset that idle timer.

Download Program

I have not tested this extensively, but it does work in Windows 7 x86 as an Admin.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
//for processes
using System.Diagnostics;
//for COM add-in
using System.Reflection;

namespace WinIdleDelay

    class Program
        static void Main(string[] args)
            Delay d = new Delay();
            DateTime start = DateTime.Now;
            Process[] processlist;
            bool willdelay = false;
            //loop forever
            while (true)
                processlist = Process.GetProcesses();
                //add code here to look at running processes, if one is running that should trigger a delay, then delay
                //here we're always delaying the input timer no matter what
                willdelay = true;
                if (willdelay == true)
                    Console.WriteLine("Time delayed at: " + DateTime.Now);
                    Console.WriteLine("Do not delay timer.");
                Console.WriteLine("Input Timer currently at: " + d.GetLastInputTime());
                //wait a few seconds
                //reset variable
                willdelay = false;
    //here's the heart of it
    class Delay
        static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
        public static extern void keybd_event(
        byte bVk,
        byte bScan,
        uint dwFlags,
        uint dwExtraInfo

        const int VK_CONTROL = 0x11;
        const uint KEYEVENTF_KEYUP = 0x2;
        bool ctrlPressed = false;

        public Delay()

        //we're actually triggering a keyboard event.
        public void delay()
            keybd_event((byte)VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
        //you can access the timer used to monitor input events.  This timer gets reset when an event is triggered and delays things like locking of the screen.
        public int GetLastInputTime()
            int idleTime = 0;
            LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
            lastInputInfo.cbSize = Marshal.SizeOf( lastInputInfo );
            lastInputInfo.dwTime = 0;

            int envTicks = Environment.TickCount;

            if ( GetLastInputInfo( ref lastInputInfo ) )
                int lastInputTick = lastInputInfo.dwTime;
                idleTime = envTicks - lastInputTick;
            return (( idleTime > 0 ) ? ( idleTime / 1000 ) : 0);
    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));

    public int cbSize;
    //public UInt32 dwTime;
    public int dwTime;