shuhelohelo’s blog

Xamarin.Forms多めです.

Windowsのタスクトレイ常駐型アプリを作る

ambilykk.com

環境

  • Windows10 1908
  • .NET Core 3.1 preview 3

ウィンドウを表示させない

常駐型アプリの体裁としてウィンドウを表示させないということは大事なことです.

コンソールアプリの場合

ソリューションエクスプローラで右クリックしてコンテキストメニューから「プロパティ」を選択.

「アプリケーション」タブの中の「出力の種類(Output Type)」を「Console Application」から「Windows Application」に変更する.

でも,Mainメソッドの処理ぬけたら終了してしまうので,それをどうにかしないと常駐アプリにならない.

WPFアプリの場合

App.xamlStartupUriを削るだけでよい.

アイコンの表示の準備

常駐アプリといえばタスクトレイにアイコン. これははずせません.

アイコンを表示させるためにはNotifyIconを使います.

これを使えばアイコンを表示させることができます.

まずはアイコンをプロジェクトに追加します.

.icoファイルを作成してソリューションエクスプローラで追加します.

そのファイルのプロパティを開いて,Copy to Output Directoryの項目をCopy alwaysに変更します.

次にNotifyIconを使うためにSystem.Windows.Formsを参照します.それと,.icoファイルを扱うためにSystem.Drawingを参照します.

この2つは,C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\3.1.0-*にあります.バージョン番号は環境によって異なります.

ソリューションエクスプローラから参照を追加します.

↑間違っていました。 WinFormsのライブラリを参照したい場合は以下の記事のようにcsprojファイルに<UseWindowsForms>true</UseWindowsForms>を追加すればよいです。 ありがとうございましたm( )m qiita.com

これで準備完了です.

アイコン表示

以下のコードを実行すると,タスクトレイにアイコンが表示されます.簡単ですね.

今回はWPFアプリでMainWindowを表示させないので,以下のコードはApp.xaml.csのOnStartupメソッドに書いていきます.

            NotifyIcon icon = new NotifyIcon();

            icon.Icon = new System.Drawing.Icon("./test.ico");
            icon.Visible = true;

ついでにマウスオーバーしたときのToolTipsを表示させましょう.以下のコードを追加します.

icon.Text = "My Icon";

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

少なくともユーザーがアプリケーショを終了させることができるようにコンテキストメニューを追加しましょう.

            //Menuのインスタンス化
            var menu = new ContextMenuStrip();

            //MenuItemの作成
            ToolStripMenuItem menuItem = new ToolStripMenuItem();
            menuItem.Text = "&Exit";
            menuItem.Click += (s, e) =>
            {
                //アプリを終了
               System.Windows.Application.Current.Shutdown();
            };

            //MenuにMenuItemを追加
            menu.Items.Add(menuItem);

            //Menuをタスクトレイのアイコンに追加
            icon.ContextMenuStrip = menu;

右クリックでコンテキストメニューが出て,「Exit」をクリックするとアプリが終了します.

おわり

あとはメニューとイベントハンドラーを追加していけば立派な常駐アプリの完成です.

最後に今回のOnStartupメソッドの全体を掲載しておきます.

        protected async override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            NotifyIcon icon = new NotifyIcon();

            icon.Icon = new System.Drawing.Icon("./test.ico");
            icon.Visible = true;
            icon.Text = "My Icon";

            //Menuのインスタンス化
            var menu = new ContextMenuStrip();

            //MenuItemの作成
            ToolStripMenuItem menuItem = new ToolStripMenuItem();
            menuItem.Text = "&Exit";
            menuItem.Click += (s, e) =>
            {
                System.Windows.Application.Current.Shutdown();
            };

            //MenuにMenuItemを追加
            menu.Items.Add(menuItem);

            //Menuをタスクトレイのアイコンに追加
            icon.ContextMenuStrip = menu;
        }