- PVSM.RU - https://www.pvsm.ru -

Будильник для компьютера на C#

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

Как все должно было быть? Я запускаю свое приложение — будильник, выставляю в сколько часов он должен меня будить и какую программу при этом запускать (телик, музыку ...) и перевожу ПК в спящий режим, по истечении времени программа должна была подать ОС какой то сигнал типу «Вставай пора будить хозяина!» и запустить нужное мне приложения.

Для этого я перелопатил пол интернета, прочитал множество статей про спящий режим компьютера, что делает в этот момент ОС Windows и т.д. задавал вопросы на разных форумах и все что они могли мне сказать это «Будильник есть в телефоне, зачем тебе этот геморрой» или что та в этом роде, правда на майкрософте написали что можно сделать но это будет довольно таки сложно, короче посоветовали мне использовать технологию WOL [1] там как то все это делается через сеть, при этом один комп должен быть постоянно включен чтоб подать сигнал другом компе и тот должен проснутся! Но мне показалось что это как то не удобно получится. Но ничего я не отчаялся и пошел в сторону WinAPI, и вот момент истинны… «Ура, Нашел!».

Для роботы мне понадобилось всего три WinAPI функции и справка MSDN.
Итак, приступим!
1. Создать консольное приложение;
2. Подключить неймспейс для роботы с API;
3. Написать нужные функции;
4. Создать один метод.

Для роботы с WinAPI подключаем System.Runtime.InteropServices [2] и пишем наши API-функции

[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 IntPtr handle;
static void SetWaitForWakeUpTime()
{
    long duetime = -900000000; 
    Console.WriteLine("Все, ложитесь спать хозяин! Я Вас утром разбужу!);
    handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer");
    SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true);
    uint INFINITE = 0xFFFFFFFF;
    int ret = WaitForSingleObject(handle, INFINITE);  
    System.Diagnostics.Process.Start("C:Program FilesAIMP3AIMP3.exe"); 
}

Надеюсь в коде все понятно, переменная long хранит время (в наносекундах да-да), далее создали таймер который все этот обрабатывает и по истечении времени запускает проигрыватель.

Все так просто, а сколько положил усилий чтоб найти как можно сделать.

В итоге мы получили полезное приложение которое может нас будить с утра (плюс ко всему у него получился красивый интерфейс).

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

Надеюсь Вам интересно читать мой пост, спасибо за внимание!

P.S. Если у вас не работает приложение но при этом компиляция прошла без ошибок, тогда проверьте разрешен ли у вас в настройках электропитания пункт «Разрешить таймеры пробуждения».

Автор: Taras_Kovalenko


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/13556

Ссылки в тексте:

[1] WOL : http://ru.wikipedia.org/wiki/Wake-on-LAN

[2] System.Runtime.InteropServices: http://msdn.microsoft.com/ru-ru/library/system.runtime.interopservices.aspx