Предотвращение закрытия 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; после предотвращения завершения работы мои завершения программы. (ПК не завершает работу),

Как я получаю тот же результат их обоих?

6
задан Raidri supports Monica 10 June 2014 в 15:32
поделиться

7 ответов

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

0
ответ дан 17 December 2019 в 18:09
поделиться

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

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

0
ответ дан 17 December 2019 в 18:09
поделиться

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

С уважением

1
ответ дан 17 December 2019 в 18:09
поделиться

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;
2
ответ дан 17 December 2019 в 18:09
поделиться

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

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

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

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

0
ответ дан 17 December 2019 в 18:09
поделиться

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.
0
ответ дан 17 December 2019 в 18:09
поделиться

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

0
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: