Предотвращение закрытия Windows - PullRequest
6 голосов
/ 21 июня 2010

Для обнаружения и предотвращения выключения компьютера я использую очень простую программу. Он имеет только одну форму и одну частную процедуру, как показано ниже:

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 ]

2 голосов
/ 21 июня 2010

РЕДАКТИРОВАТЬ: изменено на перехват WM_ENDSESSION вместо WM_QUERYENDSESSION.

Поскольку вы не можете напрямую изменить поведение TApplication, вы можете вместо этого установить хук сообщения TApplication, который нейтрализует сообщение WM_ENDSESSION.

Установкатакой хук довольно прост, вам нужно только добавить метод, подобный следующему, к вашей основной форме и зарегистрировать хук в 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;
1 голос
/ 23 июня 2010

Я обычно запускаю команду «shutdown -a».Вы можете сделать то же самое из своего кода, чтобы прервать работу Windows при завершении работы.

С уважением

0 голосов
/ 23 июня 2010

ShutdownGuard построен с Delphi и имеет открытый исходный код, вы можете скачать его, настроить его под свои нужды

0 голосов
/ 22 июня 2010

Во всех версиях не следует ли использовать событие FormCloseQuery?

procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Canclose := Not StillDoingImportantStuff;
end;

Упс - просто прочитайте комментарии к «это не работает» :( Отличается ли win 7?

Ввсе мои приложения это вызывает, если Windows пытается завершить работу ...

0 голосов
/ 21 июня 2010

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

0 голосов
/ 21 июня 2010

Тестируете ли вы на одной ОС?В Vista произошли некоторые изменения при закрытии приложения.Прочитайте это: Изменения завершения работы приложения в Windows Vista

Если вы тестируете в той же ОС, возможно, Delphi 2010 обрабатывает сообщения WM_ENDSESSION по-другому.В Delphi 7 сообщение WM_ENDSESSION обрабатывается в Application.WndProc.

0 голосов
/ 21 июня 2010

Редактировать: вот подход, который не работает. Спасибо

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.
...