Предотвращение выключения 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 ответов


Это похоже на ошибку в Delphi. Я предлагаю вам разместить это на Quality Central.


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, и это с открытым исходным кодом, вы можете скачать его настроить его для ваших нужд