C#: How to wake up system which has been shutdown?

元气小坏坏 提交于 2019-12-17 23:15:19

问题


Is there any Win32 API for waking up a system that has been shut down, at a specific time? I have seen a program named Autopower On which is able to power the system on at a specified time.


回答1:


Got the below post from a site. Any body tried this?

Nothing in the framework, so you'll have to "PInvoke" a bit. The API's you need to call are CreateWaitableTimer and SetWaitableTimer. Following is a complete (Q&D) sample that illustrates how you can set a system to be awoken from sleep/hibernate using above Win32 API's. Note that here I'm setting a relative wakeup time of 300000000 nSecs. That means that the computer will wake-up (supposing he's asleep or hibernating) within 30 seconds after setting the timer. Consult the MSDN docs for details on SetWaitableTimer and it's arguments.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

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

        [DllImport("kernel32.dll")]
        public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long
        pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr
        lpArgToCompletionRoutine, bool fResume);

        [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
        public static extern Int32 WaitForSingleObject(IntPtr handle, uint
        milliseconds);

        static void Main()
        {
            SetWaitForWakeUpTime();
        }

        static IntPtr handle;
        static void SetWaitForWakeUpTime()
        {
            long duetime = -300000000; // negative value, so a RELATIVE due time
            Console.WriteLine("{0:x}", duetime);
            handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer");
            SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true);
            uint INFINITE = 0xFFFFFFFF;
            int ret = WaitForSingleObject(handle, INFINITE);
            MessageBox.Show("Wake up call");
        }
    }
}



回答2:


This Wake on LAN (WOL) code project post might be of use (Both motherboard and NIC must support WOL)




回答3:


Once you actually shut down your computer(not sleeping or hibernating) you can't wake it up from C#, C++ code directly. After all the OS itself is closed.

The only chance would be for your motherboard to support some kind of timer mechanism. And with some C++ function to be able to write some flags into the BIOS and set that timer.




回答4:


Use the windows "Scheduled Task" menu. See:

http://www.howtogeek.com/119028/how-to-make-your-pc-wake-from-sleep-automatically/

You create a program that you want to run upon wake up and then manually enter it into the windows scheduled task list for the first time to wake after a specific time.

When you program awakens, I am not sure if you need your program to call a Windows API to stop it being awoken again, ditto if you want your program to power off the PC after starting another sceduled task to awaken it again. Need to reserach what windows APIs there are for this.



来源:https://stackoverflow.com/questions/4061844/c-how-to-wake-up-system-which-has-been-shutdown

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!