Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выключение компа в 2 этапа

376
06 августа 2007 года
Absolut
220 / / 22.11.2002
Доброго времени суток.

Хочу тушить из своего кода питание компа. Использую ExitWindowsEx( EWX_POWEROFF | EWX_FORCE, 0 ). Питание тушится, но при этом все не сохраненные данные теряются. Поэтому решил вызывать сначала с флагом EWX_SHUTDOWN, чтобы процессы завершились как положено. Однако в таком случае, если есть какое-то приложение, типа блокнота с несохраненным текстом - вылетает окошко с просьбой сохранить. И пока кнопочку не нажать - комп не выключится. Решил обрабатывать WM_ENDSESSION и по событию заводить таймер, который через, скажем 5 секунд, принудительно выключит комп через флаг EWX_FORCE. Но вот незадача, почему-то не попадаю в обработчик на WM_ENDSESSION. Где может быть затык, кто подскажет ?
8.8K
06 августа 2007 года
Se AD WMD
165 / / 10.01.2007
А почемуб не воспользоваться стандартной мелкософтской утилитой shutdown.exe(Входит по дефалту в ХР и 2003), запускать её из ShellExecute с флагами например так:
shutdown.exe -s -f -t 00
,где-s (выключить) -f(принудительное завершение) -t 00(время 00(в секундах)).
3.3K
07 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Absolut
Однако в таком случае, если есть какое-то приложение, типа блокнота с несохраненным текстом - вылетает окошко с просьбой сохранить. И пока кнопочку не нажать - комп не выключится.

Ну так а ты чего хотел? Чтобы блокнот сам документ сохранил? Ты же не хочешь, чтобы данные терялись, поэтому такое окошко и вылезает.

376
07 августа 2007 года
Absolut
220 / / 22.11.2002
Цитата: Se AD WMD
А почемуб не воспользоваться стандартной мелкософтской утилитой shutdown.exe(Входит по дефалту в ХР и 2003), запускать её из ShellExecute с флагами например так:
shutdown.exe -s -f -t 00
,где-s (выключить) -f(принудительное завершение) -t 00(время 00(в секундах)).



Проблемы с выключением нет. Поэтому не вижу смысла пользоваться упомянутыми утилитами. Есть проблема в том, что не принимаю сигнала WM_ENDSESSION.

376
07 августа 2007 года
Absolut
220 / / 22.11.2002
Цитата: ShadyMan
Ну так а ты чего хотел? Чтобы блокнот сам документ сохранил? Ты же не хочешь, чтобы данные терялись, поэтому такое окошко и вылезает.



Наиболее приоритетная задача - выключение питания. Но как вариант, сначала хотелось "по доброму" завершить все программы. А уж потом, тех, кто будет сопротивляться задушить принудительно. Пусть даже и с потерей данных.

3.3K
07 августа 2007 года
ShadyMan
191 / / 15.07.2006
Ну так объясни, ты хочешь, чтобы данные в блокноте сохранялись или нет? Если хочешь, всё равно придётся нажимать на кнопочку "Да", чтобы сохранить документ. Если не хочешь, то тогда о какой нежелательной потере данных ты говоришь?
376
07 августа 2007 года
Absolut
220 / / 22.11.2002
Цитата: ShadyMan
Ну так объясни, ты хочешь, чтобы данные в блокноте сохранялись или нет? Если хочешь, всё равно придётся нажимать на кнопочку "Да", чтобы сохранить документ. Если не хочешь, то тогда о какой нежелательной потере данных ты говоришь?



Вариант с блокнотом - это так как пример просто привел. Понятно, что просто так без вмешательства пользователя текст будет не сохранить. Сохранить данные хотелось бы там, где данная операция сводится к обработке сигналов WM_QUERYENDSESSION и WM_ENDSESSION. Которые должны посылаться всем приложениям при вызове ExitWindowsEx( EWX_POWEROFF | EWX_SHUTDOWN, 0). А уж потом, если, что-то ещё осталось висеть незавершенное в системе - добить вызовом ExitWindowsEx( EWX_POWEROFF | EWX_FORCE, 0). Надеюсь идея ясна.

А проблема в том, что я в этой же программе, которая вызывает ExitWindowsEx() не попадаю в обработчик на WM_ENDSESSION. И не знаю куда копать в данной ситуации.

3.3K
07 августа 2007 года
ShadyMan
191 / / 15.07.2006
Ну вот смотри, в MSDN'е же чётко написано (статья "WM_QUERYENDSESSION"):
Цитата:
If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

То есть, если хотя бы одна падла не захочет завершаться, то до посылки WM_ENDSESSION дело просто не дойдёт. Получается, твоя задумка сразу неработоспособна: нельзя сначала закрыть тех, кто соглашается закрыться, а потом убить несогласных. Или ты всех закрываешь по согласию, или всех сразу убиваешь.
Ну я так понял, по крайней мере.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог