Programowanie w języku Delphi » FAQ

Jak przywrócić ikonkę w trayu po restarcie powłoki systemu

Zdarza się czasem, że powłoka Windows (najczęściej jest to proces explorer.exe), popularnie mówiąc, "zawiesi się". Można powłokę restartować przez zabicie jej procesu - uruchamia się wtedy na nowo. Przy takiej operacji traci się niektóre ikonki w trayu. "Niektóre", bo część ikonek wraca na swoje miejsce. Wszystko zależy od tego, czy aplikacja, która umieściła swoją ikonkę (bądź ikonki) w trayu potrafi zareagować na restart powłoki. Aby dodać do swojej aplikacji taką "odporność" na restart powłoki należy:


1. zarejestrować (lub pobrać) komunikat 'TaskbarCreated' (najlepiej tuż po starcie aplikacji, zanim zostanie utworzony główny formularz) za pomocą funkcji RegisterWindowMessage:

var
  WM_TASKBARCREATED : DWORD;
 
//...
  WM_TASKBARCREATED := RegisterWindowMessage('TaskbarCreated');


Ten komunikat jest zawsze rejestrowany przez powłokę przy starcie. Ponowna próba jego rejestracji (uwaga na wielkość liter!) powoduje, że funkcja po prostu zwraca numer komunikatu wygenerowany podczas pierwszej rejestracji.


2. dodać (jeśli nie istnieje) procedurę obsługi okna w głównym formularzu:

procedure TForm1.WndProc(var Message:TMessage);
begin  
  if Message.Msg = WM_TASKBARCREATED then //odebranie tego komunikatu oznacza, że powłoka została zrestartowana
  begin
    //ponownie dodać ikonkę (ikonki) do traya
  end;
  inherited;
end;

(Jak_dodać_ikonę_do_traya)

Działać to będzie od Windows98 - dla starszych systemów konieczne będzie doinstalowanie Internet Explorera w wersji co najmniej 4.

2 komentarze

olesio 2008-11-21 21:36

Przydatna porada - dziękuję, ale dodam że pod Delphi 3 Personal oraz pewnie pomiędzy
3, a 7 również należy dodać override, bo inaczej nie wykonuje się procedura WndProc.

Swamp 2007-03-29 23:04

trzeba jeszcze dodac override by zadzialało :) (d7 pe)