附表机醒来(Schedule machine to wake up)

2019-06-26 04:25发布

什么是程序导致的Windows XP(或以上)的机器在特定的时间醒来的最佳途径。 (理想情况下,很多像媒体中心如何能够自动启动,以记录特定电视节目)

我有一个Windows服务(C#编写的),我想这项服务能够导致它在在预定时间启动托管的机器。

是否有任何BIOS设置或先决条件(如ACPI)需要进行配置使其正常工作?

本机是使用拨号或3G无线调制解调器,所以很遗憾不能依靠网络唤醒。

Answer 1:

您可以使用可等待计时器从暂停或休眠状态唤醒。 从我能找到,它是不可能以编程方式从正常关闭状态唤醒(软关闭/ 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();
}


Answer 2:

在Win7,taskschd.msc(我beleive XP以及)的任务调度程序可以设置为唤醒不同的触发系统。 这些触发器可以日程,时间,事件等。

至少在Win7的,你需要设置“允许唤醒定时器”为“Enabled”这个工作。 此设置下找到...

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



Answer 3:

最好的办法是使用网络唤醒功能。 这将需要另一台机器发出一种特殊的数据包来唤醒你的机器了。

如果你的机器没有连接到网络上,或者您由于某种原因不wasnt这个逻辑移动到另一台机器上这会不会是有帮助的。 但它的一些配置,你必须多台机器,并希望以编程方式唤醒他们有用。



Answer 4:

有些机器具有可设定在一定的时间来唤醒计算机BIOS的闹钟。 它应该有可能这个时钟程序,但我不知道具体的细节。

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

虽然警告 :尝试任何更改BIOS设置,直接务必从BIOS屏幕每个设置写下来,因为在一个错误的情况下,BIOS会恢复到出厂默认设置,你可能需要重新设置它,因为它是以前。



文章来源: Schedule machine to wake up