エクスプローラが停止しタスクバーが再起動した時のタスクトレイ処理
97 RestartExplorer 動作確認 Delphi2007 更新日 2010/06/24(木)

WindowsXP等でよく起きていた問題ですが、
フォルダを閲覧するエクスプローラ、
つまりWindows自体というかWindowsシェルというか
それが何らかの原因で壊れた場合、
一時的にタスクバーがなくなってしまいます。

場合によっては、その後復帰しますが
タスクトレイの中身は消えてしまいます。

そこで、タスクバーが再起動するタイミングで、
タスクトレイアイコンを再登録する必要があります。
それにはメインウィンドウをサブクラス化して
メッセージを見張る必要があるようです。

────────────────────
type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  private 
    OldWndProc: TWndMethod; 
    procedure FormWndProc(var Message: TMessage); 
  public 
  end; 

…省略…

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  OldWndProc := Self.WindowProc; 
  Self.WindowProc := FormWndProc; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  Self.WindowProc := OldWndProc; 
end; 

procedure TForm1.FormWndProc(var Message: TMessage); 
var 
  Msg_TaskbarCreated: UINT; 
begin 
  Msg_TaskbarCreated := RegisterWindowMessage('TaskbarCreated'); 

  if Message.Msg = Msg_TaskbarCreated then 
  begin
   Self.Caption := 'タスクバー復活したよ'; 
  end;

  OldWndProc(Message); 
end; 


────────────────────
上記の"タスクバー復活"のメッセージが入る部分にて
タスクトレイのアイコン登録を行うようにするとよいでしょう。

例えばTTrayIconコンポーネントでは
    TaskTray1.Visible := False;
    TaskTray1.Visible := True;
とするとよいです。

こうすればexplorerの復帰と共に
タスクトレイアイコンの表示も元に戻るようになります。

デバッグのために、こういう状況をシミュレートするためには
タスクマネージャーでexplorerを無理矢理停止して
その後にタスクマネージャーの[ファイル]-[新しいタスクの実行]
で、explorerを入力すると動作確認が出来ます。