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

в 11:37, , рубрики: .net, WinAPI, Программирование, метки: , ,

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

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

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

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

Для роботы с WinAPI подключаем System.Runtime.InteropServices и пишем наши 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js