Chris's coding blog

Wake up from Sleep (CreateWaitableTimer) in C#

June 18, 2009

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();
}
}
}
view raw gistfile1.cs hosted with ❤ by GitHub

csharpwinforms

I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via GithubStackoverflowResume