2010-10-31 26 views
9

Czy jest jakiś Win32 API do budzenia systemu, który został zamknięty, w określonym czasie? Widziałem program o nazwie Autopower On, który jest w stanie zasilać system w określonym czasie.C#: Jak obudzić system, który został zamknięty?

+3

Kiedy uruchamiałbyś ten program C#? Gdy komputer jest wyłączony? Lub zanim zostanie wyłączony? – Gabe

+0

Uruchom ten program, zanim zostanie wyłączony. – vishnu

+0

Musisz przekopać się do ACPI. Trochę googlowania mówi, że możesz uzyskać do niego dostęp za pomocą WMI, ale nie jestem pewien w jakim stopniu. – Brad

Odpowiedz

11

Got the below post z witryny. Jakieś ciało tego próbowało?

Nic w ramach, więc będziesz musiał trochę "wyskoczyć". Interfejsy API, które należy wywołać, to CreateWaitableTimer i SetWaitableTimer. Poniżej znajduje się kompletna (Q & D) przykład ilustrujący, w jaki sposób można ustawić system ze stanu uśpienia/hibernacji przy użyciu powyższych interfejsów API Win32. Należy zauważyć, że tutaj ustawiam względny czas pobudki wynoszący 300000000 nSecs. Oznacza to, że komputer będzie budził się (przypuszczając, że śpi lub zapada w sen) w ciągu 30 sekund po ustawieniu timera. Sprawdź dokumentację MSDN, aby uzyskać szczegółowe informacje na temat SetWaitableTimer i jego argumentów.

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace Willys 
{ 
    class Program 
    { 
     [DllImport("kernel32.dll")] 
     public static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, 
     bool bManualReset, string lpTimerName); 

     [DllImport("kernel32.dll")] 
     public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long 
     pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr 
     lpArgToCompletionRoutine, bool fResume); 

     [DllImport("kernel32", SetLastError = true, ExactSpelling = true)] 
     public static extern Int32 WaitForSingleObject(IntPtr handle, uint 
     milliseconds); 

     static void Main() 
     { 
      SetWaitForWakeUpTime(); 
     } 

     static IntPtr handle; 
     static void SetWaitForWakeUpTime() 
     { 
      long duetime = -300000000; // negative value, so a RELATIVE due time 
      Console.WriteLine("{0:x}", duetime); 
      handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer"); 
      SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true); 
      uint INFINITE = 0xFFFFFFFF; 
      int ret = WaitForSingleObject(handle, INFINITE); 
      MessageBox.Show("Wake up call"); 
     } 
    } 
} 
+4

Edytowałem program, aby działał. Sprawdziłem, że budzi mój komputer ze snu i hibernacji. Nie sądzę jednak, żeby się obudził z zamykania. – Gabe

+0

@Gabe: ok. dziękuję za edycję – vishnu

+0

Próbowałem tego kodu na pulpicie i tablecie z Windows 8, ale to nie działa. Czy musi coś zrobić z moim urządzeniem obsługującym tę funkcję, czy też wszystkie urządzenia obsługują opcję wybudzania?Spojrzałem na opcję Zezwalaj na zegary w opcji uśpienia w zaawansowanych ustawieniach mocy, ale zmieniając to również w pracy na pulpicie i na tablecie masz opcję –

2

Ten kod Wake on LAN (WOL) projekt wpis może mieć zastosowania (zarówno płyta główna i karta sieciowa musi obsługiwać WOL)

2

Po rzeczywistym zamknięciu komputera (bez snu lub hibernacji) nie można go obudzić bezpośrednio z kodu C#, C++. Po tym wszystkim sam system operacyjny jest zamknięty.

Jedyna szansa na to, że płyta główna będzie obsługiwać mechanizm zegarowy. I z pewną funkcją C++, aby móc napisać kilka flag do BIOS-u i ustawić ten timer.

-1

Użyj okna "Zaplanowane zadanie" menu. Zobacz:

http://www.howtogeek.com/119028/how-to-make-your-pc-wake-from-sleep-automatically/

utworzyć program, który chcesz uruchomić po obudzić, a następnie ręcznie wprowadzić go do okna listy zadań zaplanowanych po raz pierwszy obudzić po określonym czasie.

Kiedy program się przebudzi, nie jestem pewien, czy potrzebujesz, aby twój program wywoływał interfejs API systemu Windows do przestań go budzić, tak samo, jeśli chcesz, aby twój program wyłączył komputer po rozpoczęciu kolejnego zaplanowanego zadania, aby go obudzić jeszcze raz. Musisz zastanowić się, jakie są dostępne w tym celu interfejsy API systemu Windows.

+1

To jest odpowiedź nie-programistyczna, która byłaby odpowiednia dla SuperUser. Nie odpowiada jednak na zadane pytanie programistyczne, które wymaga skonfigurowania przebudzenia z C#. –

Powiązane problemy