LoginSignup
19
21

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-12

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

19
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21