タスクトレイのアイコンが消えてしまうのを防ぐ方法?

解決


ふみちゃん  2008-02-16 22:03:31  No: 29822

タイトルの通り、長年タスクトレイ駐在アプリをつくり使っていますが、
何かの拍子にタスクトレイ中アイコンが消えてしまう事があり困っています。
消えたことを感知、または消えるのを防止する方法を教えてください!!
よろしくお願いします。


Fusa  2008-02-17 02:40:29  No: 29823

以前書いたメモがあったのでどうぞ。
役に立つかな?

タスクトレイコンポーネントで
こういうコードを書かなくても
この状況に対応しているものも多いと思うけど。

-- タスクバーの起動を感知する --

フォルダを閲覧するエクスプローラ、
つまり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を入力するとよい。
動作確認が出来るだろう。


ofZ  2008-02-17 07:41:48  No: 29824

フォームであれば、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以降あたりが必要のはず。


ふみちゃん  2008-02-24 07:20:04  No: 29825

ありがとうございました!
その後色々調べました、、
灯台もと暗しですね、、何度も見ていた、下記にヒントがありました。
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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加