bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] NotifyIconを使ってアプリをタスクトレイに収納する

[C#] NotifyIconを使ってアプリをタスクトレイに収納する

Jan 17, 2026 C# , .NET Framework bucket-sort

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();
        }
    }
}
C# .NET Framework WinForms Windows Code Snippet
← MySQL 8.0 vs 8.4ベンチマーク比較(sysbench / t3.small) [C#] アプリケーションのデータをJSONにシリアライズする - JsonSerializer →

Related Posts

  • [C#] グローバルフックとキーボードフックを理解する - SetWindowsHookExの使い方 Jan 25, 2026
  • [C#] .NETが用意しているアプリケーションの設定クラスを試す - ConfigurationBuilder Jan 20, 2026
  • [C#] アプリケーションの設定をJSON形式で保存する - JsonSerializer Jan 19, 2026
  • [C#] アプリケーションのデータをJSONにシリアライズする - JsonSerializer Jan 18, 2026

Table of Contents

  • NotifyIcon でできること
  • 典型的な用途
  • サンプルコード

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.