2009-07-17 25 views
12

¿Cuál es la mejor forma de provocar que una máquina con Windows XP (o superior) se active por programación en un momento específico? (Idealmente, se parece mucho a cómo Media Center puede iniciarse automáticamente para grabar un programa de TV particular)Programar la máquina para reactivar

Tengo un servicio de Windows (escrito en C#) y me gustaría que este servicio pueda causar la máquina está alojado en para iniciarse en tiempos predeterminados.

¿Hay alguna configuración del BIOS o requisitos previos (por ejemplo, ACPI) que deban configurarse para que esto funcione correctamente?

Esta máquina estaría utilizando un módem inalámbrico de acceso telefónico o 3G, por lo que desafortunadamente no puede confiar en Wake on LAN.

+0

Tal vez la gente en http://serverfault.com lo sabría. – jmservera

Respuesta

10

Puede activar waitable timers para activar desde un estado suspendido o de hibernación. Por lo que puedo encontrar, no es posible despertar programáticamente del modo de apagado normal (soft off/S5), en ese caso, debe especificar una alarma WakeOnRTC en el BIOS. Para usar temporizadores que se puedan usar desde C#, necesita pInvoke. Las declaraciones de importación son:

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

Puede utilizar las funciones de la siguiente manera:

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

continuación, puede cancelar el temporizador temporizador con CancelWaitableTimer, utilizando el identificador devuelto como un argumento.

Su programa puede hibernar y dormir usando 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); 
} 

Su sistema puede no permitir que los programas para dejar el ordenador en modo de hibernación. Usted puede llamar al siguiente método para permitir la hibernación:

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

Parece que podría ser. Encontré otro ejemplo de esto aquí - http://www.codeproject.com/Articles/49798/Wake-the-PC-from-standby-or-hibernation –

+0

Seguí tu código, el sistema puede pasar con éxito al modo de hibernación , pero, no se despertó nuevamente desde el modo de hibernación en el tiempo especificado. – Viswa

+0

No he seguido este código real, pero puedo confirmarlo en un hardware de hace una década (con las opciones del BIOS configuradas (ver a continuación)), esta API Win32 funciona. Escribí una herramienta de sincronización de C# que funcionó. –

0

Algunas máquinas tienen un despertador BIOS que se puede configurar para reactivar la computadora a una determinada hora. Debería ser posible programar este reloj, pero no conozco los detalles específicos.

Editar: Encontré este program que debería permitirle establecer la hora. Está en C, bajo Linux, pero tal vez pueda darle algunas pistas.

Un advertencia sin embargo: antes de intentar cualquier cosa que cambie la configuración del BIOS sean directamente asegúrese de anotar cada configuración de las pantallas de la BIOS, ya que en caso de un error del BIOS podría volver a los valores de fábrica y puede que tenga que configurarlo de nuevo como estaba.

1

Su mejor opción es utilizar Wake on LAN capacidad. Esto requerirá que otra máquina envíe un paquete de un tipo especial para reactivar su máquina.

Esto no será útil si su máquina no está conectada a la red o si por alguna razón no es necesario mover esta lógica a otra máquina. Pero es útil para algunas configuraciones en las que tiene varias máquinas y desea activarlas programáticamente.

4

El programa del programador de tareas en Win7, taskschd.msc (y creo que también en XP) se puede configurar para activar el sistema en diferentes activadores. Esos desencadenantes pueden ser programación, hora, evento, etc.

Al menos en Win7, debe configurar "Permitir Temporizadores Wake" en 'Habilitado' para que esto funcione. Esta configuración se encuentra bajo ...

-> Panel de control de sonido \ Opciones de energía
clic \ hardware y la configuración del plan - "Editar"
clic - "Cambiar configuración avanzada de energía"
ampliar - "Sleep"
Expandir "Permitir temporizadores Wake"

+0

Creo que esto se está acercando a la respuesta real. Como quiero hacer esto programáticamente, quiero saber qué API usar para configurar un 'temporizador de reactivación' –

+0

Bueno, el programador de tareas en Win7 es diferente al de XP. Para XP, puede usar el comando at (http://support.microsoft.com/kb/313565) o la API de Task Scheduler 1.0 (http://msdn.microsoft.com/en-us/library/aa383579(VS. 85) .aspx). Tienes un contenedor en http://www.codeproject.com/KB/cs/tsnewlib.aspx. Mientras que en Windows 7 tiene la nueva API 2.0 (http://msdn.microsoft.com/en-us/library/aa384138(VS.85).aspx) – jmservera

Cuestiones relacionadas