Расписание машины просыпаться - PullRequest
14 голосов
/ 17 июля 2009

Какой лучший способ программно заставить компьютер с Windows XP (или выше) просыпаться в определенное время. (В идеале очень похоже на то, как Media Center может запускаться автоматически для записи конкретной телепрограммы)

У меня есть служба Windows (написана на C #), и я хотел бы, чтобы эта служба могла запускать машину, на которой она размещена, в заданное время.

Существуют ли какие-либо параметры или предпосылки BIOS (например, ACPI), которые необходимо настроить для правильной работы?

Эта машина будет использовать коммутируемый модем или беспроводной модем 3G, поэтому, к сожалению, она не может полагаться на Wake on LAN.

Ответы [ 4 ]

12 голосов
/ 27 октября 2011

Вы можете использовать ожидаемые таймеры для выхода из режима ожидания или спящего режима. Из того, что я могу найти, невозможно программно выйти из обычного режима выключения (мягкое выключение / 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();
}
4 голосов
/ 22 сентября 2010

Программа планировщика заданий в Win7, taskschd.msc (и я также верю в XP) может быть настроена на пробуждение системы при разных срабатываниях. Такими триггерами могут быть расписание, время, событие и т. Д.

По крайней мере в Win7 вам нужно установить «Разрешить таймеры пробуждения» на «Включено», чтобы это работало. Этот параметр находится под ...

-> Панель управления \ Оборудование и звук \ Параметры электропитания
нажмите - «Редактировать настройки плана»
нажмите - «Изменить расширенную настройку мощности»
развернуть - "Спи"
Развернуть - «Разрешить таймеры пробуждения»

1 голос
/ 17 июля 2009

Ваша лучшая ставка - использование возможности Wake on LAN . Это потребует, чтобы другая машина отправила пакет особого вида, чтобы разбудить вашу машину.

Это не поможет, если ваша машина не подключена к сети или вы по какой-то причине не перенесли эту логику на другую машину. Но это полезно для некоторых конфигураций, когда у вас есть несколько машин, и вы хотите разбудить их программно.

0 голосов
/ 17 июля 2009

На некоторых машинах есть будильник BIOS, который можно настроить для включения компьютера в определенный час. Должно быть возможно запрограммировать эти часы, но я не знаю конкретных деталей.

Редактировать : Я нашел эту программу , которая должна позволить вам установить время. Это в C, под Linux, но, возможно, он может дать вам несколько советов.

A предупреждение хотя: прежде чем пытаться что-либо изменить настройки BIOS напрямую, обязательно запишите каждую настройку с экранов BIOS, потому что в случае ошибки BIOS может вернуться к заводская настройка по умолчанию, и вам может потребоваться установить ее заново, как было.

...