15

以编程方式使 Windows XP(或更高版本)机器在特定时间唤醒的最佳方法是什么。(理想情况下,很像 Media Center 如何自动启动以录制特定的电视节目)

我有一个 Windows 服务(用 C# 编写),我希望该服务能够使其托管的机器在预定时间启动。

是否需要配置任何 BIOS 设置或先决条件(例如 ACPI)才能正常工作?

这台机器将使用拨号或 3G 无线调制解调器,所以很遗憾它不能依赖 LAN 唤醒。

4

4 回答 4

12

您可以使用可等待计时器从挂起或休眠状态唤醒。据我所知,无法以编程方式从正常关机模式(软关机/S5)唤醒,在这种情况下,您需要在 BIOS 中指定 WakeOnRTC 警报。要使用 C# 中的可等待计时器,您需要pInvoke。进口声明如下:

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

您可以通过以下方式使用这些功能:

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

CancelWaitableTimer然后,您可以使用返回的句柄作为参数取消可等待计时器。

您的程序可以使用 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);
}

您的系统可能不允许程序让计算机进入休眠状态。您可以调用以下方法来允许休眠:

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"; // this might be different in other locales
    return p.Start();
}
于 2011-10-27T17:57:17.690 回答
4

Win7 中的任务调度程序taskschd.msc(我也相信XP)可以设置为在不同的触发器上唤醒系统。这些触发器可以是时间表、时间、事件等。

至少在 Win7 中,您需要将“允许唤醒计时器”设置为“启用”才能使其正常工作。此设置位于...

--> 控制面板\硬件和声音\电源选项
点击-“编辑计划设置”
点击-“更改高级电源设置”
展开-“睡眠”
展开-“允许唤醒定时器”

于 2010-09-21T22:22:37.530 回答
2

您最好的选择是使用LAN 唤醒功能。这将需要另一台机器发送一个特殊类型的数据包来唤醒你的机器。

如果您的机器没有连接到网络,或者由于某种原因您没有将此逻辑移动到另一台机器上,这将无济于事。但它对于您拥有多台机器并希望以编程方式唤醒它们的某些配置很有用。

于 2009-07-17T07:16:43.217 回答
0

有些机器有一个 BIOS 闹钟,可以设置为在特定时间唤醒计算机。应该可以对这个时钟进行编程,但我不知道具体细节。

编辑:我发现这个程序应该让你设置时间。它在 C 语言中,在 Linux 下,但也许它可以给你一些提示。

警告:在尝试直接更改 BIOS 设置之前,请务必记下BIOS 屏幕上的每个设置,因为如果出现错误,BIOS 可能会恢复为出厂默认设置,您可能需要按原样重新设置。

于 2009-07-17T07:03:32.463 回答