2009-07-17 16 views
12

Jaki jest najlepszy sposób programowego spowodowania wybudzenia komputera Windows XP (lub nowszego) o określonej godzinie. (Idealnie jak w przypadku Media Center można uruchomić automatycznie, aby nagrać konkretny program telewizyjny)Zaplanuj urządzenie, aby się obudzić.

Mam usługę Windows (napisaną w C#) i chciałbym, aby ta usługa była w stanie spowodować, że maszyna to jest hostowany w celu uruchomienia w określonych z góry godzinach.

Czy są jakieś ustawienia systemu BIOS lub wymagania wstępne (np. ACPI), które należy skonfigurować, aby działało poprawnie?

Urządzenie to będzie korzystało z połączenia modemowego lub modemu bezprzewodowego 3G, więc niestety nie może polegać na funkcji Wake on LAN.

+0

Może ludzie na stronie http://serverfault.com będą o tym wiedzieć. – jmservera

Odpowiedz

10

Możesz użyć waitable timers, aby wybudzić ze stanu zawieszenia lub hibernacji. Z tego, co udało mi się znaleźć, nie można programowo wybudzić z normalnego trybu wyłączania (miękkie wyłączanie/S5), w takim przypadku należy określić alarm WakeOnRTC w systemie BIOS. Aby używać wyczekiwanych timerów z C#, potrzebujesz pInvoke. Deklaracje importowe są:

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

Można korzystać z tych funkcji w następujący sposób:

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

Następnie można anulować waitable czasomierz z CancelWaitableTimer korzystając zwrócony uchwyt jako argument.

Program może hibernacji i uśpienia przy użyciu 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); 
} 

Twój system może nie pozwolić programy, aby komputer do stanu hibernacji. Możesz wywołać następującą metodę zezwalającą na hibernację:

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

Wygląda na to, że to może być to. Znalazłem inny przykład tego tutaj - http://www.codeproject.com/Articles/49798/Wake-the-PC-z-zabezpieczenia-or-nbernacji –

+0

Podążyłem za twoim kodem, System może z powodzeniem przejść do trybu hibernacji , ale, Nie obudził się ponownie z trybu hibernacji w określonym czasie. – Viswa

+0

Nie śledziłem tego rzeczywistego kodu, ale mogę to potwierdzić na dziesięcioletnim sprzęcie (z zestawem opcji BIOS (patrz poniżej)), ten Win32 API działa. Napisałem narzędzie do synchronizowania C#, które działało z przyjemnością. –

0

Niektóre urządzenia mają budzik BIOS, który można ustawić tak, aby budził komputer o określonej godzinie. Powinno być możliwe zaprogramowanie tego zegara, ale nie znam konkretnych szczegółów.

Edytuj: Znalazłem ten program, który powinien pozwolić Ci ustawić czas. Jest w C, pod Linuksem, ale może może dać ci wskazówki.

ostrzeżenie jednak: przed podjęciem próby niczego, co zmienia ustawienia BIOS bezpośrednio należy zanotować każdy ustawienie z ekranów BIOS, ponieważ w przypadku błędu systemu BIOS może powrócić do ustawień fabrycznych i konieczne może być ustaw ponownie tak, jak było.

1

Najlepszym rozwiązaniem jest użycie funkcji Wake on LAN. To będzie wymagać, aby inna maszyna wysłała pakiet specjalnego rodzaju, aby obudzić twoją maszynę.

Nie będzie to pomocne, jeśli urządzenie nie jest podłączone do sieci lub z jakiegoś powodu nie należy przenosić tej logiki na inną maszynę Ale jest to przydatne w niektórych konfiguracjach, w których masz wiele komputerów i chcesz je programowo obudzić.

4

Program do planowania zadań w Win7, taskschd.msc (i ja również uważam, XP) może być ustawiony, aby obudzić system na różnych wyzwalaczy. Tymi wyzwalaczami mogą być harmonogram, czas, zdarzenie itp.

Przynajmniej w Win7, musisz ustawić "Zezwalaj na czasomierze" na "Włączone", aby to działało. To ustawienie znajduje się pod ...

-> Panel sterowania \ dźwiękowe \ Opcje zasilania
kliknij Sprzęt i - "Edytuj ustawienia planu"
Click - "Zmień zaawansowane ustawienia zasilania"
rozwinąć - "uśpienia"
Rozwiń - "Zezwalaj na zegary czasu"

+0

Myślę, że zbliża się to do prawdziwej odpowiedzi. Ponieważ chcę to zrobić programowo, chcę wiedzieć, jakiego API użyć, aby ustawić "zegar wake" –

+0

Cóż, harmonogram zadań w Win7 różni się od tego w XP. W przypadku XP można użyć polecenia at (http://support.microsoft.com/kb/313565) lub interfejsu API Task Scheduler 1.0 (http://msdn.microsoft.com/en-us/library/aa383579 (VS. 85) .aspx). Masz opakowanie w http://www.codeproject.com/KB/cs/tsnewlib.aspx. W systemie Windows 7 masz nowy interfejs API 2.0 (http://msdn.microsoft.com/en-us/library/aa384138(VS.85).aspx) – jmservera

Powiązane problemy