Windowsのタスクトレイ常駐型アプリを作る
環境
- Windows10 1908
- .NET Core 3.1 preview 3
ウィンドウを表示させない
常駐型アプリの体裁としてウィンドウを表示させないということは大事なことです.
コンソールアプリの場合
ソリューションエクスプローラで右クリックしてコンテキストメニューから「プロパティ」を選択.
「アプリケーション」タブの中の「出力の種類(Output Type)」を「Console Application」から「Windows Application」に変更する.
でも,Mainメソッドの処理ぬけたら終了してしまうので,それをどうにかしないと常駐アプリにならない.
WPFアプリの場合
App.xaml
のStartupUri
を削るだけでよい.
アイコンの表示の準備
常駐アプリといえばタスクトレイにアイコン. これははずせません.
アイコンを表示させるためには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; }