エクスプローラが停止しタスクバーが再起動した時のタスクトレイ処理
|
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を入力すると動作確認が出来ます。
|