[BlueLeaf1336]> PROBLEMS> RecentApps>

RecentApps > タスクトレイプログラム調査

historyTOP

2005/02/19:作成

2005/02/19TOP

一体、何度調べれば気がすむのかわからないぐらいですが、「タスクトレイである」という条件をまず満たすことにします。実は時間通知プログラムを作ってみたときに調べたことがあります。

ただ、明らかにバグっていて、一度でもフォームを表示すると、Windowsのシャットダウンをせき止めてしまいます。今回調べなおすことでちゃんとせき止めないように対応して、気が向けば、向こうも修正するようにしたいと思います。でもやっぱり、次の2つがそのままパクッテくれといっているような感じです。

Torry's Delphi Pagesにあるサンプルコードはそのまま持ってきても正しく動作するんですが、定数宣言が重複しているようです(単純に重複部分を削除するだけで大丈夫です)。また「AllocateHWnd」「DeallocateHWnd」は使用が推奨されていませんが、「Classes.AllocateHWnd」「Classes.DeallocateHWnd」とすると使用が推奨されているかどうかはわかりませんが、警告は出なくなります。

改めてReminderのソースを見ていると、タスクトレイ関係の処理がクラス化されていてなにやら良い感じです。でも、間違いなくシャットダウン・再起動・ログオフを妨げてますが。こちらを先に直すべきのようです。クラスを再利用すべきのようです。

タスクトレイに常駐するプログラムなのでできるだけタスクバーに表示されないようにしているのですが、設定画面(メインフォームです)表示中だけは、確か何か具合が悪くてタスクバーに表示するようにしています。

さて、このプログラムを終了する方法として、「設定画面を表示している時に×ボタンを押す」「タスクトレイアイコンを右クリックして終了メニューを選択する」の2つがあります。で、いずれの方法をとっても「OnCloseQuery」「OnClose」「OnDestroy」イベントがこの順番で走ります。

ところが、このプログラムを常駐させた状態で、一度でも設定画面(メインフォーム)を表示させると、(上記のいずれの方法でも正しく終了するのに)Windowsのシャットダウン・再起動・ログオフいずれの場合でも「OnCloseQuery」イベントだけが走って、それ以上すすまず普通に居座っています。

あきらかに無理がありますが「OnCloseQuery」内に「CanClose := True」や「Application.Terminate」を記述しても駄目です。

あまりに本筋から離れそうなので、Reminder > 全面見直しに振ることにします。

帰ってきました。で、タスクトレイアプリケーションのテンプレートができたような感じがします。あくまでも感じですが。

20050219RecentApps.zip(194,697bytes)

見たとおりですが、起動後にアイコンをタスクトレイに表示して、右クリックに反応するポップアップメニューを表示します。また、左クリック・左ダブルクリック・右ダブルクリックにも反応するためのダミー関数を用意しています。

メニューは4種類あって、ひとつは下図のようなバージョン情報画面を表示するもの、それから自分自身をスタートアップに登録するもの、スタートアップフォルダを開くもの、最後にアプリケーションの終了、となっています。

このバージョン画面は少しだけ賢くて、プロジェクトに追加して関数をひとつコールするだけで、バージョン情報やなんやかやを取得し表示します。ただし、EXEコンパイル時に、ちゃんとバージョン情報を設定していることが条件ですが。

また、なぜかあらゆるキーに反応して閉じるようにしてしまったので、キャプチャするのが非常に邪魔くさかったです。

そういえば、このバージョン情報のユニットに、スタートアップフォルダの取得やその他もろもろの便利関数を突っ込んでますんで、勝手にどけるとコンパイルが通らなくなります。

こんなところで、タスクトレイプログラムについての調査は終わることにします。

EOFTOP