![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
День добрый, в интернете имеется куча примеров с отловом закрытия окна, но сам я так и не смог разобраться. Вообщем ситуация такая, требуется чтобы программа не давала пользователю закрыть себя путем выключения компьютера (через 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 рассылается.
|
|
#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
|
||||
|
||||
|
Цитата:
Последний раз редактировалось M.A.D.M.A.N., 06.09.2012 в 08:37. |
|
#13
|
|||
|
|||
|
Да, отмене, простите, на освной работе приходится сочинать тексты ниочем, вот и увлекаюсь
![]() Вообщем, 1) если при включенном Офисе с несохраненным текстом нажать выключить компьютер вылезет (Модальное? или неважно?) окно, [Сохранить] [Не сохранять] [Отмена], при этом запрос постуает только офису, а все активные приложения того же не получают т.е. они продолжают тихо мирно работать. 2) если при включенной Моей программе нажать выключение компьютера, ВСЕМ активным программам рассылается запрос на завершение и они соглашаются, все кроме моей естественно. Как сделать чтобы выключение компьютера на трогало активные программы, пока работает моя? |
|
#14
|
||||
|
||||
|
canclose = false не помогает?
|
|
#15
|
|||
|
|||
|
Нашел ответ.
Запросы на завершение программы рассылаются в порядке приоритета, для того чтобы первой запрос получила наша программа достаточно установить: SetProcessShutdownParameters($4FF,SHUTDOWN_NORETRY ); Последний раз редактировалось cdtj, 06.09.2012 в 15:54. |