Jak przywrócić ikonkę w trayu po restarcie powłoki systemu
Morris
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:
- 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.
- 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;
Działać to będzie od Windows98 - dla starszych systemów konieczne będzie doinstalowanie Internet Explorera w wersji co najmniej 4.
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.
trzeba jeszcze dodac override by zadzialało :) (d7 pe)