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(); | |
| } | |
| } | |
| } |
I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via Github, Stackoverflow, Resume