Windows の「通知領域(タスクトレイ)」に収納されて動作する、ステータスモニタ的なアプリを作る必要が出てきたので、 NotifyIcon の使い方を理解します。
System.Windows.Forms.NotifyIcon
NotifyIcon でできること
| 機能 | 内容 |
|---|---|
| アイコン表示 | タスクトレイに常駐 |
| ツールチップ | マウスホバーで説明表示 |
| バルーン通知 | ポップアップ通知表示 |
| コンテキストメニュー | 右クリックメニュー |
| クリックイベント | ダブルクリックでフォーム表示など |
典型的な用途
- 常駐型アプリ
- バックグラウンド監視ツール
- アップデータ
- プリンタ監視
- メッセンジャー系
フォームを閉じてもアプリは終了せず、トレイに常駐させる、といった動きが可能です。
サンプルコード
using System;
using System.Drawing;
using System.Windows.Forms;
// サンプル
// 1) フォームがユーザーによって閉じられる場合、NotifyIconはシステムトレイに残り、
// ユーザーにアプリケーションがまだ動作していることを通知するバルーンチップを表示する
// 2) システムトレイに入った時点からタイマーが開始され、アイコンにマウスをホバーすると
// システムトレイに入ってからの経過秒数がツールチップで表示される
// 3) NotifyIconのコンテキストメニューから「Show」を選択すると、フォームが再表示され、
// タイマーが停止する
// 4) NotifyIconのコンテキストメニューから「Exit」を選択すると、アプリケーションが終了する
namespace NotifyIconSample
{
public partial class Form1 : Form
{
private NotifyIcon notifyIcon;
private ContextMenuStrip contextMenu;
private Timer timer;
private DateTime trayStartTime;
public Form1()
{
InitializeComponent();
Initialize();
}
void Initialize()
{
// NotifyIconの作成
notifyIcon = new NotifyIcon();
notifyIcon.Icon = SystemIcons.Application;
notifyIcon.Visible = true;
notifyIcon.Text = "NotifyIcon Sample";
// コンテキストメニューの作成
contextMenu = new ContextMenuStrip();
ToolStripMenuItem showItem = new ToolStripMenuItem("Show");
showItem.Click += (s, e) =>
{
this.Show();
timer.Stop(); // フォームを表示したらタイマーを停止
};
contextMenu.Items.Add(showItem);
ToolStripMenuItem exitItem = new ToolStripMenuItem("Exit");
exitItem.Click += (s, e) => Application.Exit();
contextMenu.Items.Add(exitItem);
notifyIcon.ContextMenuStrip = contextMenu;
// タイマーの作成
timer = new Timer();
timer.Interval = 1000; // 1秒ごとに更新
timer.Tick += Timer_Tick;
}
/// <summary>
/// タイマーのTickイベントハンドラ
/// システムトレイに入ってからの経過秒数を表示
/// </summary>
private void Timer_Tick(object sender, EventArgs e)
{
int elapsedSeconds = (int)(DateTime.Now - trayStartTime).TotalSeconds;
notifyIcon.Text = $"NotifyIcon Sample - {elapsedSeconds}秒経過";
}
/// <summary>
/// フォームを閉じるイベントハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// フォームがユーザーによって閉じられる場合
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true; // フォームのクローズをキャンセル
this.Hide(); // フォームを非表示にする
// システムトレイに入った時刻を記録してタイマーをスタート
trayStartTime = DateTime.Now;
timer.Start();
// ユーザーにアプリケーションがシステムトレイで動作していることを通知
notifyIcon.ShowBalloonTip(
1000,
"NotifyIcon Sample",
"The application is still running in the system tray.",
ToolTipIcon.Info);
return;
}
// フォームがアプリケーションの終了によって閉じられる場合は
// NotifyIconをクリーンアップ
timer.Stop();
notifyIcon.Visible = false;
notifyIcon.Dispose();
}
}
}