Расписание машины на пробуждение
Каков наилучший способ программно заставить компьютер с Windows XP (или выше) просыпаться в определенное время. (В идеале очень похоже на то, как Media Center может запускаться автоматически для записи конкретной телепрограммы)
У меня есть служба Windows (написана на C#), и я хотел бы, чтобы эта служба могла запускать машину, на которой она размещена, в заданное время.
Существуют ли какие-либо параметры или предпосылки BIOS (например, ACPI), которые необходимо настроить для правильной работы?
Эта машина будет использовать коммутируемый модем или беспроводной модем 3G, поэтому, к сожалению, она не может полагаться на Wake on LAN.
4 ответа
Вы можете использовать ожидающие таймеры для выхода из режима ожидания или спящего режима. Из того, что я могу найти, невозможно программно выйти из обычного режима выключения (мягкое выключение /S5), в этом случае вам нужно указать сигнал тревоги WakeOnRTC в BIOS. Чтобы использовать ожидаемые таймеры из 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 (и я также считаю, что XP) может быть настроена на пробуждение системы при различных триггерах. Такими триггерами могут быть расписание, время, событие и т. Д.
По крайней мере в Win7 вам нужно установить "Разрешить таймеры пробуждения" на "Включено", чтобы это работало. Этот параметр находится под...
-> Панель управления \ Оборудование и звук \ Параметры электропитания
нажмите - "Редактировать настройки плана"
нажмите - "Изменить расширенную настройку мощности"
развернуть - "Спи"
Развернуть - "Разрешить таймеры пробуждения"
Лучше всего использовать функцию Wake on LAN. Это потребует, чтобы другая машина отправила пакет особого вида, чтобы разбудить вашу машину.
Это не поможет, если ваша машина не подключена к сети или вы по какой-то причине не перенесли эту логику на другую машину. Но это полезно для некоторых конфигураций, когда у вас есть несколько машин и вы хотите, чтобы они работали программно.
На некоторых машинах есть будильник BIOS, который можно настроить, чтобы компьютер просыпался в определенный час. Должно быть возможно запрограммировать эти часы, но я не знаю конкретных деталей.
Изменить: я нашел эту программу, которая должна позволить вам установить время. Это в C, под Linux, но, возможно, он может дать вам несколько советов.
Предупреждение: перед тем, как что-либо изменить настройки BIOS напрямую, обязательно запишите все настройки с экранов BIOS, поскольку в случае ошибки BIOS может вернуться к заводским настройкам по умолчанию, и вам, возможно, придется установить его заново, как было.