私のプログラムは、ユーザーが最小化する可能性があるため、システムトレイにアイコンを配置します。ただし、アプリケーションがクラッシュした場合、またはVSでのアプリの実行を停止した場合は、マウスでアプリケーションにカーソルを合わせるまでアイコンが残ります。時々私はそこを見下ろします、そして10かそこらのアイコンがあるでしょう。
アイコンが消えることを確認できますか?
私のプログラムは、ユーザーが最小化する可能性があるため、システムトレイにアイコンを配置します。ただし、アプリケーションがクラッシュした場合、またはVSでのアプリの実行を停止した場合は、マウスでアプリケーションにカーソルを合わせるまでアイコンが残ります。時々私はそこを見下ろします、そして10かそこらのアイコンがあるでしょう。
アイコンが消えることを確認できますか?
これを行う方法はありません。Windows は、プログラムがまだ生きているかどうかを確認するために、プログラムをポーリングしません。したがって、アイコンを終了するように指示する (通常の終了) か、ユーザーがプログラムへの呼び出しを開始する何か (マウスオーバーなど) を行うまで、アイコンはシステム トレイに残ります。そうして初めて、シェルはプログラムが終了したことを認識し、アイコンをクリーンアップする必要があります。
いくつかのオプションがあります:
1) 終了前にアイコンの破棄を保証するルート構造化例外ハンドラーを作成します。これには多少の手間がかかりますが、基本的には、独自の未処理の例外ハンドラーを Windows に追加できます。これは、多くの形式の「ブーム」の場合に呼び出され、最後の溝をクリーンアップする機会を与えてくれます。
2) メイン プロセス ハンドルでスリープし、起動時にアイコンを強制終了する (メイン アプリケーションが終了した) 監視アプリケーションを作成します。この後者のシナリオをうまく機能させるには、メイン プロセスがアイコン自体を強制終了しないようにする必要があります。または、アイコンを破棄せずに終了する必要があることを監視アプリに伝える方法を作成することもできます (監視アプリをスリープ状態にします)。プロセス ハンドルと名前付きイベントの両方で - イベントによって起こされた場合、メイン アプリの後にクリーンアップせずに終了します)。
終了する前に、NotifyIconVisibleプロパティをfalseに設定します。
トレイを離れるには、NotifyIconでDisposeを呼び出す必要があります。
編集:Program.csにフックできるイベントがあります。すべてのWindowsアプリで、次のようになります。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Applicationクラスには、アプリがいつ終了するかを知るために利用できるいくつかのイベントがあります。
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
フォームを閉じる前に、trayIcon を非表示にすることができます。FormClosing イベントを追加
NotifyIcon ni;
...
...
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
ni.Visible = false;
}