什么是程序导致的Windows XP(或以上)的机器在特定的时间醒来的最佳途径。 (理想情况下,很多像媒体中心如何能够自动启动,以记录特定电视节目)
我有一个Windows服务(C#编写的),我想这项服务能够导致它在在预定时间启动托管的机器。
是否有任何BIOS设置或先决条件(如ACPI)需要进行配置使其正常工作?
本机是使用拨号或3G无线调制解调器,所以很遗憾不能依靠网络唤醒。
什么是程序导致的Windows XP(或以上)的机器在特定的时间醒来的最佳途径。 (理想情况下,很多像媒体中心如何能够自动启动,以记录特定电视节目)
我有一个Windows服务(C#编写的),我想这项服务能够导致它在在预定时间启动托管的机器。
是否有任何BIOS设置或先决条件(如ACPI)需要进行配置使其正常工作?
本机是使用拨号或3G无线调制解调器,所以很遗憾不能依靠网络唤醒。
您可以使用可等待计时器从暂停或休眠状态唤醒。 从我能找到,它是不可能以编程方式从正常关闭状态唤醒(软关闭/ 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();
}
在Win7,taskschd.msc(我beleive XP以及)的任务调度程序可以设置为唤醒不同的触发系统。 这些触发器可以日程,时间,事件等。
至少在Win7的,你需要设置“允许唤醒定时器”为“Enabled”这个工作。 此设置下找到...
- >控制面板\硬件和声音\电源选项
点击 - “编辑计划设置”
点击 - “更改高级电源设置”
扩大 - “睡眠”
展开 - “允许唤醒定时器”
最好的办法是使用网络唤醒功能。 这将需要另一台机器发出一种特殊的数据包来唤醒你的机器了。
如果你的机器没有连接到网络上,或者您由于某种原因不wasnt这个逻辑移动到另一台机器上这会不会是有帮助的。 但它的一些配置,你必须多台机器,并希望以编程方式唤醒他们有用。
有些机器具有可设定在一定的时间来唤醒计算机BIOS的闹钟。 它应该有可能这个时钟程序,但我不知道具体的细节。
编辑 :我发现这个程序是应该让你设置的时间。 这是一个在C,在Linux下,但也许可以给你一些提示。
虽然警告 :尝试任何更改BIOS设置,直接务必从BIOS屏幕每个设置写下来,因为在一个错误的情况下,BIOS会恢复到出厂默认设置,你可能需要重新设置它,因为它是以前。