C#:如何唤醒已关机的系统?

时间:2010-10-31 04:27:20

标签: c# .net windows-xp acpi winapi

是否有任何Win32 API用于唤醒已在特定时间关闭的系统?我见过一个名为Autopower On的程序,可以在指定的时间启动系统。

4 个答案:

答案 0 :(得分:11)

从网站获得the below post。有人试过这个吗?

框架中没有任何东西,所以你必须“PInvoke”一点。 您需要调用的API是CreateWaitableTimer和SetWaitableTimer。 以下是一个完整的(Q& D)示例,说明了如何设置a 使用上面的Win32 API从睡眠/休眠中唤醒的系统。 请注意,这里我设置的相对唤醒时间为3000000 nSecs。 这意味着计算机将被唤醒(假设他已经睡着了或者 在设定定时器后30秒内休眠。 有关SetWaitableTimer及其参数的详细信息,请参阅MSDN文档。

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

答案 1 :(得分:2)

Wake on LAN (WOL)代码项目帖子可能有用(主板和NIC都必须支持WOL)

答案 2 :(得分:2)

一旦你真正关闭了计算机(不睡觉或休眠),你就无法直接从C#,C ++代码中唤醒它。在所有操作系统本身关闭之后。

唯一的机会是你的主板支持某种计时器机制。并且有一些C ++函数能够将一些标志写入BIOS并设置该计时器。

答案 3 :(得分:0)

使用Windows“计划任务”菜单。参见:

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

您创建一个要在唤醒时运行的程序,然后在特定时间后第一次将其手动输入到Windows计划任务列表中。

当你编程唤醒时,我不确定你是否需要你的程序来调用Windows API 停止它再次被唤醒,同样如果你想让你的程序在启动另一个已调查的任务再次唤醒它之后关闭电脑。需要研究一下那些用于此的Windows API。