| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Как обработать выключение компьютера? |
| Автор: E_v_g 24.1.2008, 11:12 | ||||
При выключении компьютера завершаются все программы, а моя программа становится активной и комп не вырубается. При закрытии программы пользователем или при завершении работы ОС она должна сохранить настройки. Как это корректно реализовать?
|
| Автор: MetalFan 24.1.2008, 12:18 |
| настройки чтоли долго сохраняются? |
| Автор: E_v_g 25.1.2008, 11:29 |
| Неа, быстро сохраняются. Короче, я ее победил - поставил Halt в каждом обработчике и все заработало как надо. Вроде бы... |
| Автор: MetalFan 25.1.2008, 14:05 |
| сохраняй настройки в OnDestroy главной формы |
| Автор: E_v_g 26.1.2008, 05:52 |
| Пробовал - при первой попытке выйти из Windows программа гаснет, Windows не завершается, требуется вторая попытка. |
| Автор: MetalFan 26.1.2008, 09:56 |
| ерунда какаято. что происходит во время сохранения опций? |
| Автор: E_v_g 28.1.2008, 06:02 | ||
Вот сохранение:
Кроме того, на форме есть WebBrowser и штук 5 Timer-ов, может, в них дело? |
| Автор: EvilsInterrupt 30.1.2008, 19:23 |
| MetalFan, не может, а нужно! |
| Автор: E_v_g 31.1.2008, 05:46 | ||||
Убрал все это:
Переписал завершение в OnDestroy:
Теперь при завершении винды программа не гаснет, винда, соответственно, не завершается. Плюс к тому же не сохраняются настройки, то есть событие OnDestoy не происходит. Хотя при ручном закрытии формы сохранение работает. Таймеры все убил |
| Автор: E_v_g 31.1.2008, 06:05 |
| Ладно, мастера, спасибо, не ломайте голову, пока устраивает и так: (на этом же форуме натолкнулся на эту мысль) |
| Автор: simsmann 17.2.2008, 20:14 |
| Вопрос поставлен давно, но до сих пор на него нет ответа!!! Этот вопрос ставился на многих форумах, есть статьи но ничего не дает результата!!! Вот некоторые ссылки http://valler.narod.ru/master/ShutDown.html http://www.delphikingdom.com/asp/answer.asp?IDAnswer=57161 http://delphiworld.narod.ru/_app_.html В том числе и на этом форуме вот тема поднималась в общих вопросах http://forum.vingrad.ru/forum/topic-70589.html#st_0_view_0 Как правило трудности у тех программ которые помещают икону в систем трей. Обработка WMQueryEndSession и WMEndSession ничего не дает, если даже программа на выходе ничего не сохраняет, все равно программа выгружается если обработать WMQueryEndSession и WMEndSession, а винда затормозилась и продолжает работать какбудто команды на выключение не было. Кто решил данную проблема ОТКЛИКНИТЕСЬ!!! |
| Автор: dumb 18.2.2008, 05:04 | ||
какой вопрос? куда поставлен?!
в обработчике WM_QUERYENDSESSION вернуть TRUE, в обработчике WM_ENDSESSION вернуть 0, завершить выполнение программы. |
| Автор: simsmann 18.2.2008, 21:11 | ||||||
| dump не надо грязи! E v q четко поставил вопрос. Внимательно изучи вопрос потом давай советы. E v q представил код
Message.Result := 1; это тоже самое, что и TRUE
Кстати 0 в WMEndSession запрещает завершение Виндов, точнее говорит о том, что прога не готова к завершению. WMQueryEndSession отличается от WMEndSession только тем, что это первое и второе опевещение программ о завершении Виндов.
А такой вопрос!!! Винда не завершается, как правило если вы помещаете икону программы в систем трей, там где часы и убираете отображение кнопки программы на панели задач. Причем не важно используете вы компоненты для этой цели (опробовал несколько) или своими ручками помещаете икону в систем трей. И ставьте хоть сто раз в обработчиках WMEndSession и WMQueryEndSession :=TRUE или целое значение отличное от нуля, это значение тоже дает ОС сообщение, что программа готова к завершению Виндов (0 запрещает выгрузку ОС говоря, что окно не готово закрыться) Самое интересное то, что при исследовании выяснилось, что ВИНДА второй раз(вначале опрашивается WMQueryEndSession, а потом если окна не готовы второй раз WMEndSession) не посылает сообщение. И проблема здесь наверно в том, что программа при помещении значка в систем трей сидит именно в процессах. Закрытие программы методом Close, Application.Terminate и выставление TRUE ничего не дает в обработчике WMQueryEndSession программа выгружается, а ВИНДА прекращает и WMEndSession не вызывается. Если все поставить в WMEndSession или туда и сюда тоже самое. Прошерстил все форумы, данный ворос встречается часто, но ответа НЕТ! Но слава БОГУ! и Винграду на котором всетаки нарисовался ответ. смотрите мой ответ по аналогичному вопросу, но в разделе общие вопросы. Вот ссылка: http://forum.vingrad.ru/forum/topic-70589/unread-1/anchor-entry1417174/15.html |
| Автор: MetalFan 18.2.2008, 23:27 | ||||
неправда!
|