タイトルの通り、長年タスクトレイ駐在アプリをつくり使っていますが、
何かの拍子にタスクトレイ中アイコンが消えてしまう事があり困っています。
消えたことを感知、または消えるのを防止する方法を教えてください!!
よろしくお願いします。
以前書いたメモがあったのでどうぞ。
役に立つかな?
タスクトレイコンポーネントで
こういうコードを書かなくても
この状況に対応しているものも多いと思うけど。
-- タスクバーの起動を感知する --
フォルダを閲覧するエクスプローラ、
つまり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.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;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldWndProc := Self.WindowProc;
Self.WindowProc := FormWndProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Self.WindowProc := OldWndProc;
end;
────────────────────
上記の"タスクバー復活"のメッセージが入る部分にて
タスクトレイのアイコン登録を行うようにする。
例えばTrayIconコンポーネントでは
TaskTray1.Registered := False;
TaskTray1.Registered := True;
とするとよい、
こうすればexplorerの復帰と共に
タスクトレイアイコンの表示も元に戻るようになる。
ちなみに、こういう状況をシミュレートするためには
タスクマネージャーでexplorerを無理矢理停止して
その後にタスクマネージャーの[ファイル]-[新しいタスクの実行]
で、explorerを入力するとよい。
動作確認が出来るだろう。
フォームであれば、WindowProcの差し替えじゃなくて、
WndProcをoverrideするだけでいいはず。
procedure WndProc(var Message: TMessage); override;
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
//↑のように省略できなかったかな・・・
// inherited WndProc(Message);
if Message.Msg = Msg_TaskbarCreated then
begin
Self.Caption := 'タスクバー復活したよ';
end;
end;
あと、RegisterWindowMessage('TaskbarCreated'); は、
Shell32.dll のバージョンが、4.71か4.72以降あたりが必要のはず。
ありがとうございました!
その後色々調べました、、
灯台もと暗しですね、、何度も見ていた、下記にヒントがありました。
http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=0207.txt
http://okapony.hp.infoseek.co.jp/download/indexc.html#TRAYICONPUB
また、下記も参考になりました。
http://www.ne.jp/asahi/page/fuku/tips/tasktray.htm
ツイート | ![]() |