Przechwytywanie WM_QUERYENDSESSION

0

Helou. Zmontowałem sobie procedurkę zamykającą program do traya:

procedure TfrmSpis.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  begin
  CanClose := not ZamknijDoZasob;
  if not CanClose then
    begin
    Visible := False;
    if IsWindowVisible(Handle) then
      ShowWindow(Handle, SW_HIDE);
    end;
  end;

Wszystko byłoby dobrze, gdyby nie fakt, że blokuje ona zamykanie się programu podczas zamykania systemu, gdy ZamknijDoZasob = True, który normalnie posyła program do traya. Rozwiązaniem byłoby przechwycenie zdarzenia zamykania systemu WM_QUERYENDSESSION i WM_ENDSESSION, ale do procdury obsługi zdarzeń nic nie dochodzi:

Application.OnMessage := AppMessage;
...

procedure TfrmSpis.AppMessage(var Msg: TMsg; var Handled: Boolean);
  begin
  if (Msg.message = WM_QUERYENDSESSION)  then  //ten komunikat nigdy nie dociera
    begin
    MessageBox(Handle, 'Zamykanie', 'Test', MB_OK);//test zamykania
    ZamknijDoZasob := True; //ewentualnie:    Application.Terminate; 
    end;
  end;

Domyślam się, że nadrzędna procedura obsługi komunikatów nie wysyła do zdarzenia OnMessage komunikatu o zamykaniu, lecz informuje o niej jedynie poprzez zdarzenie OnCloseQuery, a ono nie niesie ze sobą informaji o zamykaniu systemu.
Jak przechwycić komunikat WM_QUERYENDSESSION, żeby zezwolić na zamknięcie programu? Dziex.

0

Dobra, fałszywy alarm. Wystarczyło trochę głębiej pokopać w zasobach plikowych:

TfrmSpis: class(TForm)
...
  procedure WMQueryEndSession(var Message: TMessage); message WM_QUERYENDSESSION;
  end;

...
procedure TfrmSpis.WMQueryEndSession(var Message: TMessage);
  begin
  SessionEnding := True;
  Message.Result := 1;
  end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1