Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

«Решение проблемы с работой программы на Delphi в разных версиях компилятора»

Delphi , ОС и Железо , Справочник по сообщениям

Решение проблемы с работой программы на Delphi в разных версиях компилятора

Если вы используете простую программу для обнаружения и предотвращения выключения компьютера, подобную приведенной ниже, то возможно столкнулись с ситуацией, когда после предотвращения выключения программа закрывается. Эта проблема может возникнуть при компиляции программы в Delphi 2010, в отличие от Delphi 5.

TForm3 = class(TForm)
private
  procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
             message WM_QueryEndSession;
end;

procedure TForm3.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  Msg.Result := 0; //чтобы не выключать компьютер, пока работает моя программа
end;

Описание проблемы

При компиляции в Delphi 5 и Delphi 2010 обе версии программы обнаруживают выключение компьютера. Однако, после предотвращения выключения в версии, скомпилированной в Delphi 2010, программа закрывается, в отличие от версии, скомпилированной в Delphi 5.

Причина проблемы

Проблема заключается в том, что Delphi 2010 обрабатывает сообщение WM_ENDSESSION по-другому, чем Delphi 5. В Delphi 7 обработка сообщения WM_ENDSESSION происходит в Application.WndProc.

Решение проблемы

Чтобы получить одинаковый результат при компиляции в обеих версиях Delphi, можно использовать подход, предложенный Alexander в альтернативном ответе. Нужно перехватить сообщение WM_ENDSESSION с помощью хука TApplication. Для этого добавьте метод, подобный приведенному ниже, в форму и зарегистрируйте хук в 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;

Этот подход позволяет нейтрализовать сообщение WM_ENDSESSION и предотвратить закрытие программы после предотвращения выключения компьютера.

Подтвержденный ответ

Похоже, что это баг в Delphi. Рекомендуется сообщить об этой проблеме в Quality Central. Уже был создан соответствующий запрос: http://qc.codegear.com/wc/qcmain.aspx?d=84886

Альтернативные ответы

  1. Использование события FormCloseQuery не решает проблему, так как в комментариях указано, что это не работает.
  2. Запуск команды "shutdown -a" из кода может прервать выключение компьютера, но не решает проблему с закрытием программы.
  3. Библиотека ShutdownGuard, построенная на Delphi, также использует тот же подход, что и приведенная выше программа, и поэтому может столкнуться с той же проблемой.

Используйте предложенный выше подход с хуком TApplication для решения проблемы с работой программы на Delphi в разных версиях компилятора.

Создано по материалам из источника по ссылке.

Контекст: Решение проблемы с работой программы на Delphi в разных версиях компилятора, где при компиляции в Delphi 2010 программа закрывается после предотвращения выключения компьютера, в отличие от версии, скомпилированной в Delphi 5.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:20:16/0.014172077178955/1