Программа мешает перезагрузиться |
Программа мешает перезагрузиться |
Unconnected |
2.04.2010 21:08
Сообщение
#1
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Привет всем.
Сомневался между разделом Delphi и этим, запостил сюда. Есть программа на делфи, обычное такое VCL-приложение, не служба, никаких хуков, немного API (типа FindWindow, GetForeignWindow). И вот столкнулся с проблемой, что когда эта программа работает, то компьютер не получается перезагрузить или выключить (через Пуск - Выключить компьютер...). Все остальные приложения, работающие в тот момент, порядочно закрывается, а это висит, и перезагрузки/выключения не происходит. Без этого приложения всё нормально перезагружается. В журнале событий такое предупреждение (с жёлтым значком): "Попытка Перезагрузка HOME-********** не удалась". На данный момент кода с собой нет. Что это может быть? -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Client |
2.04.2010 21:31
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
есть такая фишка. Немного кода, и приложение нельзя закрыть никак. В какой-то книжке видел.
Возможно это, а может и что-нибудь другое |
Unconnected |
2.04.2010 21:39
Сообщение
#3
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Выпросил у человека код и увидел на событии формы OnCloseQuery строчку canclose:=false;. Всё ясно. Клиент, навёл на мысль
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
2.04.2010 21:49
Сообщение
#4
|
Гость |
Цитата Всё ясно Вот к чему приводят шаблоны... Чего тебе ясно?Цитата Очень часто мы сталкиваемся с проблемой, когда наша программа будучи запущенная в фоне и/или свёрнутая, например, в панель задач должна что-то сделать, когда Windows выключается, перезагружается или просто меняется пользователь. Если мы не будем отслеживать такую ситуацию, то в худшем случае у нас могут просто потеряться какие-либо данные или Windows просто не сможет выполнить перезагрузку до конца. Ей будет мешать наша программа. Не нужно думать, что Windows перед перезагрузкой рассылает приложениям сообщения о закрытии, так чтобы у тех выполнились обработчики TForm.onCloseQuery/onClose. ОС Windows отсылает перед перезагрузкой, выключением или сменой пользователя сообщения WM_QUERYENDSESSION, а потом по его успешному завершению WM_ENDSESSION. Наше приложение должно поймать эти сообщения и отреагировать так чтобы дать понять, что мы согласны перезагружаться. В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0 |
Client |
2.04.2010 22:22
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
ни form1.canclose ни Application.canclose свойств не нашел. Где оно?
Цитата Вот к чему приводят шаблоны... Чего тебе ясно? а можно узнать, что за шаблоны?Цитата В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0 И как быть тогда? Переделать оконную процедуру, и там отлавливать сообщение, сделать что надо и вернуть 0? |
Unconnected |
2.04.2010 22:43
Сообщение
#6
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Volvo, интересно...
Цитата В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0 Так получается, что по умолчанию и возвращается Не 0, раз программы закрываются. А эта - не закрывается, потому что на событии OnCloseQuery (Client, на событии) висит такой обработчик. Буду отлавливать WM_QUERYENDSESSION, так как тот обработчик видимо нужен зачем-то.. Цитата а можно узнать, что за шаблоны? Шаблоны в моей голове относительно того, как запретить закрытие приложения Сообщение отредактировано: Unconnected - 2.04.2010 23:05 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
2.04.2010 23:37
Сообщение
#7
|
Гость |
Не только в твоей голове, кстати. Это очень распространенное заблуждение. Читайте MSDN внимательнее, таких заблуждений будет меньше
|
Unconnected |
4.04.2010 12:23
Сообщение
#8
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Может, кому-то пригодится, сделал так:
Тут не возвращается значение, просто программа закрывается, результат тот же в принципе. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
4.04.2010 13:44
Сообщение
#9
|
Гость |
Я сейчас тебя поцарапаю... Опять нестандартные действия? Кто мешает:
procedure TForm1.FormCreate(Sender: TObject); ? Не надо принудительно завершать программу. Ибо результат - совсем не тот, как при нормальном завершении - деструкторы форм не отрабатывают, а если у тебя там какие-то логи пишутся? |
Client |
4.04.2010 14:57
Сообщение
#10
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
procedure TForm1.WMQUERYENDSESSION(var Msg: TMessage);А разве после halt оператор выполнится? Это же как exit - выход из процедуры |
Unconnected |
4.04.2010 15:32
Сообщение
#11
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Цитата Кто мешает: Здорово, и правда ведь, FormCloseQuery сработает после прихода сообщения.. Спасибо:) Цитата А разве после halt оператор выполнится? Не выполнится, я убрать забыл просто.. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Текстовая версия | 27.09.2024 12:12 |