Расписание машины для пробуждения

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

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

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

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

Ответ 1

Вы можете использовать ожидаемые таймеры, чтобы проснуться из состояния приостановки или спящего режима. Из того, что я могу найти, невозможно программно просыпаться из нормального режима отключения (soft off/S5), в этом случае вам нужно указать будильник WakeOnRTC в BIOS. Чтобы использовать ожидающие таймеры из С#, вам нужно 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();
}

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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