![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |