|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Отлов с закрытием окна (WMENDSESSION, и тд)
День добрый, в интернете имеется куча примеров с отловом закрытия окна, но сам я так и не смог разобраться. Вообщем ситуация такая, требуется чтобы программа не давала пользователю закрыть себя путем выключения компьютера (через shutdown.exe естественно). Везде предлагается решение подобного рода:
Код:
procedure TForm2.WMQUERYENDSESSION(var Msg: TMessage); begin msg.Result:=0; end; procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin canclose:=false end; procedure TForm2.WMENDSESSION(var Msg: TMessage); begin Msg.Result:=0; { добавив этиу строку программа перезапускает себя, но это тоже не выход: ShellExecute(Handle,'Open','Project1.exe',nil,nil,1); } end; Компьютер не выключается, но программа всё равно закрывается. Подскажите пожалуйста, как избежать закрытия программы? |
#2
|
||||
|
||||
Странно, а мне наооборот пришлось искать способ чтоб винда нормально закрывалась, т.к. прога не выгружалась и выключения не происходило совсем. Но если это надо, то попробуйте в главном варе (после паблик, но до implementation) объявить булёвку типа var CnClose: Boolean; и управлять её состоянием самостоятельно, ибо есть подозрение, что делфя принудительно (особенность системы:-) посылает разрешение на закрытие от себя, без участия исполняемой части. Тогда код немного преобразится:
Код:
procedure TForm2.WMQUERYENDSESSION(var Msg: TMessage); begin CnClose:= false; Msg.Result:= 0; end; procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:= CnClose; // Вот здесь принудиловка, среде не отвертеться :) end; procedure TForm2.WMENDSESSION(var Msg: TMessage); begin CnClose:= false; Msg.Result:=0; end; |
#3
|
|||
|
|||
Насколько мне известно wmendsession вызывает formdestroy и булево с кэнклоуз не помогает (
|
#4
|
||||
|
||||
вроде WM_QUIT рассылается.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
Нашел проблему, оказалось всё проще и просто в моей голове )
Перекомпилировал на Delphi 6, всё работает как надо, программа останавливает перезагрузку/выключение и при этом не выгружается сама. зы: на embercadero delphi 2010 architect (это же переиздание delphi 7?) компилируя тот же самый код получаю результат из первого поста.. |
#6
|
||||
|
||||
на Delphi 7 сообщение WM_QUERYENDSESSION уже вызывает событие OnCloseQuery:
Код:
TCustomForm = class(TScrollingWinControl) private procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; ... procedure TCustomForm.WMQueryEndSession(var Message: TWMQueryEndSession); begin Message.Result := Integer(CloseQuery and CallTerminateProcs); end; 1. обработать WM_QUERYENDSESSION: Код:
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); begin Message.Result:=0; end; Код:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end; Пишу программы за еду. __________________ |
#7
|
|||
|
|||
Если не верите на слово привожу цитату с MS
Цитата:
т.е., если не удасться положить форму через запрос конца сессии -> запрос закрытия программы, будет выполнен конец сессии который вызывает application.terminate. добавлено: хотя опять себя обманываю, сейчас перепроверю.. |
#8
|
||||
|
||||
Цитата:
чтобы не дать системе завершить работу приложение возвращает 0 для WM_QUERYENDSESSION, что и делается: Код:
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); begin Message.Result:=0; end; Цитата:
в любом случае для своей версии Delphi можно посмотреть как обрабатывается сообщение WM_QUERYENDSESSION. Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 27.06.2012 в 11:09. |
#9
|
|||
|
|||
Прошу прощения за то что морочил голову, 100% нашел изза чего возникает проблема, моя дельфи (не очень понимаю в версиях, Embarcadero® Delphi® 2010 Version 14.0.3593.25826),
не считывает значение: Код:
Message.Result:=0; Цитата:
кстати, не у меня одного такой вот баг: http://stackoverflow.com/questions/3...dows-shut-down Последний раз редактировалось cdtj, 27.06.2012 в 13:25. |
#10
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#11
|
|||
|
|||
Появилось время вновь мучать программу и участников форума
Хочется добиться такого же результата как при открытом окне офиса при попытке выключения компьютера, т.е. только офисная программа получает запрос на выключение, а не все как в ситуации с отловом WMENDSESSION. (Когда запрос рассылается всем активным программам). Т.е. при канселяции запроса на сохранение выключение прерывается и при этом другие программы не закрываются. |
#12
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 06.09.2012 в 08:37. |
#13
|
|||
|
|||
Да, отмене, простите, на освной работе приходится сочинать тексты ниочем, вот и увлекаюсь
Вообщем, 1) если при включенном Офисе с несохраненным текстом нажать выключить компьютер вылезет (Модальное? или неважно?) окно, [Сохранить] [Не сохранять] [Отмена], при этом запрос постуает только офису, а все активные приложения того же не получают т.е. они продолжают тихо мирно работать. 2) если при включенной Моей программе нажать выключение компьютера, ВСЕМ активным программам рассылается запрос на завершение и они соглашаются, все кроме моей естественно. Как сделать чтобы выключение компьютера на трогало активные программы, пока работает моя? |
#14
|
||||
|
||||
canclose = false не помогает?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#15
|
|||
|
|||
Нашел ответ.
Запросы на завершение программы рассылаются в порядке приоритета, для того чтобы первой запрос получила наша программа достаточно установить: SetProcessShutdownParameters($4FF,SHUTDOWN_NORETRY ); Последний раз редактировалось cdtj, 06.09.2012 в 15:54. |