Предотвращение выключения Windows
для обнаружения и предотвращения отключения компьютера я использую очень простую программу. Он имеет только одну форму и одну частную процедуру, как показано ниже:
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; после предотвращения выключения моя программа закрывается. (ПК не выключается)
Как я могу получить тот же результат от них обоих?
7 ответов
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;
обычно я запускаю команду" shutdown-a". Вы можете сделать то же самое из своего кода, чтобы прервать завершение работы Windows.
в отношении
Edit: вот подход, который не работает. Спасибо
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.
вы тестируете на той же ОС? В Vista есть некоторые изменения в завершении работы приложения. Прочтите это: изменения завершения работы приложения в Windows Vista
Если вы тестируете на той же ОС, возможно, Delphi 2010 обрабатывает сообщения WM_ENDSESSION по-другому. В Delphi 7 сообщения WM_ENDSESSION обрабатываются в приложении.Функция WndProc.
во всех версиях вы не должны использовать событие FormCloseQuery?
procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Canclose := Not StillDoingImportantStuff;
end;
Oops-просто прочитайте комментарии к "это не работает": (win 7 отличается?
во всех моих приложениях это вызывается, если windows пытается закрыть...
ShutdownGuard построен с Delphi, и это с открытым исходным кодом, вы можете скачать его настроить его для ваших нужд