Top

Tags


Roadkill .NET Wiki

Google ads

Recommended reading


Search

Thursday
Jun182009

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();
        }
    }
}

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>
« Objective C by example for a C# developer | Main | Command line arguments parser »