Чтобы обнаружить и предотвратить завершают работу компьютера, я использую очень простую программу. Это имеет только одну форму и одну частную процедуру как ниже:
TForm3 = class(TForm)
private
procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
end;
и реализация
procedure TForm3.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
Msg.Result := 0; //so I don't want to shutdown while my program is running
end;
Я скомпилировал его Delphi 5 и Delphi 2010. Они оба обнаруживают завершение работы. Но когда я скомпилировал в Delphi 2010; после предотвращения завершения работы мои завершения программы. (ПК не завершает работу),
Как я получаю тот же результат их обоих?
Это похоже на ошибку в Delphi. Я предлагаю вам разместить это в Quality Central.
Вы тестируете одну и ту же ОС? В Vista внесены некоторые изменения в завершение работы приложений. Прочтите это: Изменения завершения работы приложений в Windows Vista
Если вы тестируете одну и ту же ОС, возможно, Delphi 2010 обрабатывает сообщения WM_ENDSESSION по-другому. В Delphi 7 сообщения WM_ENDSESSION обрабатываются в Application.WndProc.
Обычно я запускаю команду «shutdown -a». Вы можете сделать то же самое в своем коде, чтобы прервать завершение работы Windows.
С уважением
EDIT: изменено на перехват WM_ENDSESSION вместо WM_QUERYENDSESSION.
Поскольку вы не можете напрямую изменить поведение TApplication, вы можете установить вместо него хук сообщения TApplication, который нейтрализует сообщение WM_ENDSESSION.
Установить такой хук довольно просто, нужно только добавить метод, подобный следующему, в вашу mainform и зарегистрировать хук в FormCreate.
function TForm25.HookEndSession(var Message: TMessage): Boolean;
begin
result := false;
if Message.Msg = WM_ENDSESSION then begin
Message.Result := 0;
result := true;
end;
end;
procedure TForm25.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(HookEndSession);
end;
Во всех версиях нельзя использовать событие FormCloseQuery?
procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Canclose := Not StillDoingImportantStuff;
end;
Ой, просто прочтите комментарии к «это не работает» :( Win 7 отличается?
Во всех моих приложения, это вызывается, если Windows пытается завершить работу ...
Edit: Here's an approach that doesn't work. Спасибо
Procedure TMyForm.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
Action := caNone; //The form is not allowed to close, so nothing happens.
End; // Note: the OP says he tried this, doesn't help. See the comments.
ShutdownGuard создан на Delphi и имеет открытый исходный код, вы можете скачать его и настроить под свои нужды