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

9

有没有Win32 API可以在特定时间唤醒已关闭的系统?我见过一个名为Autopower On的程序,可以在指定时间开启计算机电源。


3
你会在什么时候运行这个 C# 程序?当电脑关闭时运行吗?还是在关闭之前运行? - Gabe
在关闭计算机之前,我运行了这个程序。 - Vishnu Pradeep
你需要深入了解ACPI。一些谷歌搜索结果表明,你可以通过WMI访问它,但我不确定到什么程度。 - Brad
@Brad:我应该搜索什么?告诉我一些关键词。 - Vishnu Pradeep
1
自動開機程式(http://lifsoft.com/)在電腦關機後無法運作,只能在睡眠/休眠狀態下運作。 - Gabe
@vishnu,我在评论中已经告诉过你了…….NET和ACPI,但看起来你已经能够找到解决方案了。 - Brad
4个回答

11

从一个网站上得到了下面的帖子。有人试过这个吗?

框架中没有相应的功能,所以你需要进行“PInvoke”。 你需要调用的API是CreateWaitableTimer和SetWaitableTimer。 以下是一个完整的(Q&D)示例,演示了如何使用上述Win32 API设置系统在睡眠/休眠状态下被唤醒。 请注意,此处我设置了相对唤醒时间为300000000纳秒。这意味着计算机将在设置定时器后的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");
        }
    }
}

4
我修改了程序,现在它可以正常运行。我已经验证过它可以唤醒计算机从睡眠和休眠状态中恢复。但是,我并不期望它可以从关机状态下启动。 - Gabe
我已经在Windows 8桌面和平板电脑上尝试了这段代码,但它无法正常工作。这是否与我的设备支持此功能有关,或者所有设备都支持唤醒选项?我查看了高级电源设置中睡眠选项下的允许唤醒计时器选项,但即使在桌面上将其更改为“开启”,也无法正常工作,而平板电脑根本没有该选项。 - Aster Veigas
在那个网站上,有一些注意事项需要确保您不需要输入密码才能唤醒它/在唤醒时,并在睡眠设置中允许唤醒计时器。 - vapcguy

2

2

如果您实际关闭计算机(不是睡眠或休眠模式),则无法直接从C#、C ++代码中唤醒它。毕竟,操作系统本身已关闭。

唯一的可能性是您的主板支持某种定时器机制。通过一些C ++函数,能够将一些标志写入BIOS并设置该定时器。


0

使用Windows的"计划任务"菜单。请参见:

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

你创建了一个程序,希望在计算机唤醒后自动运行,并手动将其添加到Windows计划任务列表中,以便在特定时间后唤醒。

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


1
这是一个非编程答案,适合于超级用户。它并没有回答所提出的编程问题,该问题需要从C#配置唤醒。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接