Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 安排机器唤醒_C#_Windows Services_Acpi - Fatal编程技术网

C# 安排机器唤醒

C# 安排机器唤醒,c#,windows-services,acpi,C#,Windows Services,Acpi,以编程方式使Windows XP(或更高版本)计算机在特定时间唤醒的最佳方法是什么。(理想情况下,就像Media Center可以自动启动以录制特定电视节目一样) 我有一个Windows服务(用C#编写),我希望该服务能够使托管它的机器在预定时间启动 是否有任何BIOS设置或先决条件(如ACPI)需要配置才能正常工作 这台机器将使用拨号或3G无线调制解调器,因此不幸的是,它不能依赖LAN唤醒。有些机器具有BIOS闹钟,可以设置为在特定时间唤醒计算机。应该可以对这个时钟进行编程,但我不知道具体细节

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

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

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


这台机器将使用拨号或3G无线调制解调器,因此不幸的是,它不能依赖LAN唤醒。

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

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

警告:在尝试直接更改BIOS设置之前,请确保记下BIOS屏幕中的每个设置,因为一旦出现错误,BIOS可能会恢复出厂默认设置,您可能需要重新设置。

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


如果您的机器没有连接到网络,或者您出于某种原因没有将此逻辑移动到另一台机器上,这将没有帮助。但是,对于某些配置,如果您有多台机器,并且希望以编程方式唤醒它们,则它非常有用。

Win7中的TaskScheduler程序taskschd.msc(以及我的beleive XP)可以设置为在不同的触发器上唤醒系统。这些触发器可以是时间表、时间、事件等

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

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

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

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

也许现场的人都会知道。我想这已经越来越接近真正的答案了。由于我想以编程的方式完成这项工作,我想知道使用什么API来设置“唤醒计时器”。好吧,Win7中的任务调度器与XP中的不同。对于XP,您可以使用at命令()或TaskScheduler 1.0API()。你有一个包装纸在里面。而在Windows7中,新的2.0API()看起来可能就是它。我在这里发现了另一个例子——我遵循了你的代码,系统可以成功地进入休眠模式,但是,它没有在指定的时间再次从休眠模式唤醒。我没有遵循这个实际的代码,但我可以保证在十年前的硬件上(设置了BIOS选项(见下文)),这个Win32 API确实工作。我写了一个C#synch工具,它非常有用。这段代码起初对我不起作用,但看看我,我成功地解决了这个问题,只将ToFileTimeUtc更改为ToFileTime。记住从电源选项启用唤醒计时器@Viswa计算机无法从休眠中唤醒,只能从休眠模式中唤醒。