Wake up from Sleep (CreateWaitableTimer) in C#

This code isn't mine, but from a newsgroup posting on Eggheadcafe.com by MVP Willy Denoyette (I couldn't find a homepage to link). I'm reposting it here for my own benefit, safe in the knowledge it will never disappear unless my database backup corrupts.

The code illustrates how to set a timer to wake your computer up having been sleep'd. It's tested on Vista and Windows 7 with sleep mode. I haven't tried it with a laptop or hibernating however.

I'll be making it into a winforms in the future soon, that sits in the system tray - I'll update the page and make a google code project when this is done.

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.Threading;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Program
    {
    	[DllImport("kernel32.dll")]
    	public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);

    	[DllImport("kernel32.dll", SetLastError = true)]
    	[return: MarshalAs(UnmanagedType.Bool)]
    	public static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In] ref long	pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, bool fResume);

    	static void Main(string[] args)
    	{
    		SetWaitForWakeUpTime();
    	}

    	static void SetWaitForWakeUpTime()
    	{
    		DateTime utc = DateTime.Now.AddMinutes(2);
    		long duetime = utc.ToFileTime();

    		using(SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero,true, "MyWaitabletimer"))
    		{
    			if(SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero,IntPtr.Zero, true))
    			{
    				using(EventWaitHandle wh = new EventWaitHandle(false,EventResetMode.AutoReset))
    				{
    					wh.SafeWaitHandle = handle;
    					wh.WaitOne();
    				}
    			}
    			else
    			{
    				throw new Win32Exception(Marshal.GetLastWin32Error());
    			}
    		}

    		// You could make it a recursive call here, setting it to 1 hours time or similar
    		Console.WriteLine("Wake up call");
    		Console.ReadLine();
    	}
    }
}
Last updated on 07 July 2009

Comments

blog comments powered by Disqus