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.