Выключение компа в 2 этапа
Хочу тушить из своего кода питание компа. Использую ExitWindowsEx( EWX_POWEROFF | EWX_FORCE, 0 ). Питание тушится, но при этом все не сохраненные данные теряются. Поэтому решил вызывать сначала с флагом EWX_SHUTDOWN, чтобы процессы завершились как положено. Однако в таком случае, если есть какое-то приложение, типа блокнота с несохраненным текстом - вылетает окошко с просьбой сохранить. И пока кнопочку не нажать - комп не выключится. Решил обрабатывать WM_ENDSESSION и по событию заводить таймер, который через, скажем 5 секунд, принудительно выключит комп через флаг EWX_FORCE. Но вот незадача, почему-то не попадаю в обработчик на WM_ENDSESSION. Где может быть затык, кто подскажет ?
shutdown.exe -s -f -t 00
,где-s (выключить) -f(принудительное завершение) -t 00(время 00(в секундах)).
Ну так а ты чего хотел? Чтобы блокнот сам документ сохранил? Ты же не хочешь, чтобы данные терялись, поэтому такое окошко и вылезает.
shutdown.exe -s -f -t 00
,где-s (выключить) -f(принудительное завершение) -t 00(время 00(в секундах)).
Проблемы с выключением нет. Поэтому не вижу смысла пользоваться упомянутыми утилитами. Есть проблема в том, что не принимаю сигнала WM_ENDSESSION.
Наиболее приоритетная задача - выключение питания. Но как вариант, сначала хотелось "по доброму" завершить все программы. А уж потом, тех, кто будет сопротивляться задушить принудительно. Пусть даже и с потерей данных.
Вариант с блокнотом - это так как пример просто привел. Понятно, что просто так без вмешательства пользователя текст будет не сохранить. Сохранить данные хотелось бы там, где данная операция сводится к обработке сигналов WM_QUERYENDSESSION и WM_ENDSESSION. Которые должны посылаться всем приложениям при вызове ExitWindowsEx( EWX_POWEROFF | EWX_SHUTDOWN, 0). А уж потом, если, что-то ещё осталось висеть незавершенное в системе - добить вызовом ExitWindowsEx( EWX_POWEROFF | EWX_FORCE, 0). Надеюсь идея ясна.
А проблема в том, что я в этой же программе, которая вызывает ExitWindowsEx() не попадаю в обработчик на WM_ENDSESSION. И не знаю куда копать в данной ситуации.
То есть, если хотя бы одна падла не захочет завершаться, то до посылки WM_ENDSESSION дело просто не дойдёт. Получается, твоя задумка сразу неработоспособна: нельзя сначала закрыть тех, кто соглашается закрыться, а потом убить несогласных. Или ты всех закрываешь по согласию, или всех сразу убиваешь.
Ну я так понял, по крайней мере.