13
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

WPFでタスクトレイ常駐アプリを作る

WPFでタスクトレイ(通知領域)常駐アプリを作ろうとしたら想像以上に手間がかかったので備忘録として初投稿です。

動作環境

  • Visual Studio 2019
  • .NET Core3.1(.NET5.0でも可)

事前準備

新しいプロジェクトの作成からWPF App(.NET)を作成しておく。

アイコンの準備

まずタスクトレイにアイコンを表示させるためicoファイルを作成しておきます。
Inkscape等のドローソフトを使うのが一番楽だと思います。
ちなみにウインドウズ標準形式アイコン作成等のサイトを使用すれば簡単にマルチアイコンが作成できます。
icoファイルを作成し終えたらソリューションエクスプローラから既存の項目として追加します。
既存の項目.png
その後プロパティのビルドアクションをリソースに変更してください。
icoファイルのプロパティ.png

Formクラスの準備

多分一番躓きやすいポイントだと思います。
他のサイトだと参照を追加してくださいとか色々書かれてると思いますが今はプロジェクトファイルの<PropertyGroup>内に

.csproj
<UseWindowsForms>true</UseWindowsForms>

と追記することでFormクラスを扱うことができます。

WFPでタスクトレイを作る

長い準備も終わったため、いよいよタスクトレイのプログラミングです。App.xaml.csのOnStartupメソッドに以下のように書いてください。

App.xaml.cs
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var icon = GetResourceStream(new Uri("icon.ico", UriKind.Relative)).Stream;
            var notifyIcon = new System.Windows.Forms.NotifyIcon
            {
                Visible = true,
                Icon = new System.Drawing.Icon(icon),
                Text = "タスクトレイ常駐アプリのテストです"
            };
        }
    }

変数iconのicon.icoには自分が用意したicoファイルの名前を使用してください。
Textはタスクトレイのアイコンにマウスオーバーしたときに出るツールチップのテキストです。
タスクトレイのツールチップ.png

コンテキストメニューの追加

App.xaml.cs
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var icon = GetResourceStream(new Uri("icon.ico", UriKind.Relative)).Stream;
            var menu = new System.Windows.Forms.ContextMenuStrip();
            menu.Items.Add("終了", null, Exit_Click);
            var notifyIcon = new System.Windows.Forms.NotifyIcon
            {
                Visible = true,
                Icon = new System.Drawing.Icon(icon),
                Text = "タスクトレイ常駐アプリのテストです",
                ContextMenuStrip = menu
            };
            notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(NotifyIcon_Click);
        }

        private void NotifyIcon_Click(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                var wnd = new MainWindow();
                wnd.Show();
            }
        }

        private void Exit_Click(object sender, EventArgs e)
        {
            Shutdown();
        }
    }

Items.Addでコンテキストメニューを追加します。
タスクトレイのコンテキストメニュー.png
またMouseClickイベントで左クリックの動作を決めることもできます。

実行時にウィンドウが表示されないようにする

これでタスクトレイに表示をすることができましたが、常駐ソフトなのに実行時にいちいちウィンドウが表示されるのは鬱陶しいため実行時にはウィンドウが表示されないようにします。
App.xamlのStartupUriを削除すればウィンドウは表示されずに動作します。
スタートアップの削除.png

まとめ

WPFでタスクトレイを扱うには<UseWindowsForms>true</UseWindowsForms>が必要。
OnStartupメソッドに処理を書き込む。
ついでにApp.xamlのStartupUriを削除する。

参考記事

Windowsのタスクトレイ常駐型アプリを作る
Using System.Windows.Forms classes in a .net core 3.0 preview9 project
[WPF] リソースの画像から BITMAP オブジェクトを生成する
C#のタスクトレイ常駐アプリの作り方のご紹介!
C# Right mouse click on button does not raise mouseclick event

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
13
Help us understand the problem. What are the problem?