![]() |
|
|
Регистрация | << Правила форума >> | 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 рассылается.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На 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; Пишу программы за еду. __________________ |