Od mniej więcej roku jako budzika używam komputera. A dokładniej programu WakeupOnStandBy. Jest to mały programik, który potrafi wybudzić komputer ze stanu uśpienia bądź hibernacji (to drugie nie na każdym komputerze) i uruchomić zadany program. Np. odtwarzacz multimedialny. Aplikacja ma bardzo dużo opcji co daje jej wielką uniwersalność. Ale z drugiej strony, ja potrzebowałem tylko budzika, a nie kombajnu.
W końcu ten nadmiar przycisków, checkboksów, pól edycyjnych mnie zirytował i postanowiłem napisać sobie budzik samemu. Taki, który będzie robił dokładnie to, czego potrzebuję – budził mnie – i nic więcej.
Aplikacja jest banalnie prosta: na górze okna mamy TimePicker z biblioteki AvalonControlsLibrary w który wprowadzamy pożądaną godzinę budzenia. Aplikacja domyślnie ustawia to pole na za 8 godzin i 10 minut. 8 godzin, bo tyle snu potrzebuje człowiek, a te 10 minut to zapas na jakieś czynności wykonywane tuż przed snem, typu gaszenie świateł, wyłączanie różnych rzeczy, modlitwa, kładzenie się, zasypianie… Pod godziną jest wielki przycisk z budzikiem – wystarczy go kliknąć i można uśpić komputer. O zadanej godzinie komputer sam się obudzi i zagra utwór, którego wybór umożliwia drugi przycisk. Wybór jest zapamiętywany w pliku konfiguracyjnym, więc nie trzeba używać tego przycisku za każdym razem.
Jak to w ogóle działa? Otóż – znów musiałem skorzystać z API Windows. Tym razem potrzebne są funkcje:
1 2 3 4 5 6 7 8 9 10 11 12 |
[DllImport("kernel32.dll")] static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes,bool bManualReset, string lpTimerName); [DllImport("kernel32.dll")] static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, bool fResume); [DllImport("kernel32.dll")] static extern bool CancelWaitableTimer(IntPtr hTimer); [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] static extern Int32 WaitForSingleObject(IntPtr handle, uint milliseconds); [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); |
Uwaga: Funkcja SetWaitableTimer
przyjmuje parametr czasu w formacie FILETIME
. Obiekt typu DateTime
można skonwertować do tego formatu używając metody ToFileTimeUtc()
.
Program przeznaczony dla systemu Windows Vista z .NET Framework 3.5 (używa klasy GlassWindow z poprzedniego postu).
Download:
Budzik
Budzik – kody źródłowe
PS: Zanim zaufasz budzikowi, upewnij się, czy twój komputer daje się programowo wybudzić z hibernacji. Jak nie, to go na noc tylko usypiaj i upewnij się, że nie zahibernuje się sam.
PPS: Nie biorę odpowiedzialności za szkody wywołane zaspaniem.