You can use the expected timers to wake up from a pause or sleep state. From what I can find, it is impossible to wake up programmatically from the normal shutdown mode (soft off / S5), in this case you need to specify the WakeOnRTC alarm clock in the BIOS. To use pending timers from C #, you need pInvoke . Import Declarations:
public delegate void TimerCompleteDelegate(); [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName); [DllImport("kernel32.dll", SetLastError = true)] static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long pDueTime, int lPeriod, TimerCompleteDelegate pfnCompletionRoutine, IntPtr pArgToCompletionRoutine, bool fResume); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool CancelWaitableTimer(IntPtr hTimer);
You can use these functions as follows:
public static IntPtr SetWakeAt(DateTime dt) { TimerCompleteDelegate timerComplete = null; // read the manual for SetWaitableTimer to understand how this number is interpreted. long interval = dt.ToFileTimeUtc(); IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer"); SetWaitableTimer(handle, ref interval, 0, timerComplete, IntPtr.Zero, true); return handle; }
You can then cancel the expected timer with CancelWaitableTimer , using the return handle as an argument.
Your program can sleep and sleep using pInvoke:
[DllImport("powrprof.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetSuspendState(bool hibernate, bool forceCritical, bool disableWakeEvent); public static bool Hibernate() { return SetSuspendState(true, false, false); } public static bool Sleep() { return SetSuspendState(false, false, false); }
Your system may not allow programs that allow your computer to enter sleep mode. You can call the following method to enable sleep mode:
public static bool EnableHibernate() { Process p = new Process(); p.StartInfo.FileName = "powercfg.exe"; p.StartInfo.CreateNoWindow = true; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.Arguments = "/hibernate on";