Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > AllocateHWND+WM_QUERYENDSESSION


Автор: MetalFan 15.3.2008, 23:45
Столкнулся недавно с такой особенностью работы c AllocateHWND.
время от времени всплывают у людей проблемы с завершением работы ОС (программа не дает завершить работу ОС).
в основном грешат на сторонние компоненты.
но, как оказалось, проблема может быть и в следующем:
если в реализации процедуры TWndMethod, которая будет использоваться в кач.аргумента AllocateHWND,
не предусмотреть обработку WM_QUERYENDSESSION, то собственно и может возникнуть такая проблема.
в обработчике следует предусмотреть такой момент:
Код

  procedure TSomeClass.SomeWndMethod( var AMsg: TMessage );
  begin
    ...
    if AMsg.Message = WM_QUERYENDSESSION then
      AMsg.Result := 1;
  end;

Автор: Alexeis 16.3.2008, 14:04
MetalFan, получается что Windows ждет разрешения завершения у всех окон и дефолтный обработчик не возвращает сам единицу? smile . Что-то странное я бы сказал...

Добавлено через 1 минуту и 1 секунду
  Кстати если написать простое окошко на API и не заморачиваться с WM_QUERYENDSESSION разве это помешает завершению работы приложения?

Автор: VICTAR 16.3.2008, 14:13
Цитата(Alexeis @  16.3.2008,  14:04 Найти цитируемый пост)
Кстати если написать простое окошко на API и не заморачиваться с WM_QUERYENDSESSION разве это помешает завершению работы приложения? 

Нет. У меня такая маленькая програмка. Она нисколько не мешает выгрузке Windows.

Автор: Rrader 16.3.2008, 14:15
Согласен с Alexeis

MetalFan, 

Код

procedure TTimer.WndProc(var Msg: TMessage);
begin
  with Msg do
    if Msg = WM_TIMER then
      try
        Timer;
      except
        Application.HandleException(Self);
      end
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;

А ведь он тоже через AllocateHWnd работает...

Автор: MetalFan 16.3.2008, 14:35
Цитата(Rrader @  16.3.2008,  14:15 Найти цитируемый пост)
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);

ну да, или так. DefWindowProc видимо правильно обрабатывает WM_QUERYENDSESSION

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)