【C#】【Form】タスクトレイにある常駐アプリの作成

■ ポイント

Point1

 * プロジェクトは、Windows Formのままでいいが、
   Program.cs を以下の[常駐アプリ]のように書き換える
[通常]
 Application.Run(new Form1());
[常駐アプリ]
 new Form1()
 Application.Run();

Point2

 * NotifyIcon を実装する

■ その他の実装方法

https://qiita.com/mitsu_at3/items/f4960af27cb32ef3e0f9
のように、ApplicationContext を利用する方法がある

なお、ApplicationContext については、以下の関連記事を参照。
https://blogs.yahoo.co.jp/dk521123/38020554.html

■ サンプル

 * 以下の仕様でサンプル作成

[a] タスクバーには表示させない
[b] タスクトレイにアイコンを置く
[c] タスクトレイのアイコンをダブルクリックすると、Formが表示
[d] タスクトレイのアイコンを右クリックすると、[表示][終了]が表示

コントロール構成

Form
 * MinimizeBox : False
 * Text : Hello World!
NotifyIcon
 * ContextMenuStrip : contextMenuStrip1
 * Icon : アイコン
 * Text : Hello World!!
ContextMenuStrip (右クリック用)
 * Items
  + toolStripMenuItem1
   - Text : 表示
  + toolStripMenuItem2
   - Text : 終了

コード

Program.cs
using System;
using System.Windows.Forms;

namespace SampleForm
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
      //Application.EnableVisualStyles();
      //Application.SetCompatibleTextRenderingDefault(false);
      //Application.Run(new Form1());
      using (var form = new Form1())
      {
         Application.Run();
      }
    }
  }
}
Form1.cs
using System;
using System.Windows.Forms;

namespace SampleForm
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void notifyIcon1_DoubleClick(object sender, EventArgs e)
    {
      this.Visible = true;
    }

    private void toolStripMenuItem1_Click(object sender, EventArgs e)
    {
      this.Visible = true;
    }

    private void toolStripMenuItem2_Click(object sender, EventArgs e)
    {
      this.notifyIcon1.Visible = false;
      Application.Exit();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      e.Cancel = true;
      this.Visible = false;
    }
  }
}


関連記事

Windows Form ~ 目次 ~

https://blogs.yahoo.co.jp/dk521123/8054245.html

素材サイト (アイコン etc)

https://blogs.yahoo.co.jp/dk521123/35503975.html

画面遷移を考える ~ ApplicationContext ~

https://blogs.yahoo.co.jp/dk521123/38020554.html