#概要
Windows向け常駐通知アプリを作ろうと思い、悩んだ末に選んだ方法を書きます。なお、近い記事があります。
https://qiita.com/horyu/items/4da2a79c6fa7311d350a
※トーストのクリック処理までしたい人は、先に一番最後の「捕捉」を読んでいただければと思います。
#要件定義
ここで言う私が作りたいアプリは以下のとおりです。
トーストで通知
タスクトレイに常駐
タスクトレイの右クリックで設定等の操作が可能
ウィンドウは非表示
#実装方法の検討
検索してみるとトーストはUWP、タスクトレイはFormでやるのが良さ(楽)そうです。トーストについてはFormでタスクトレイ表示した際のバルーンでも近い事が出来ますが、表示内容については制限があるので、トーストの自由度は魅力的です。しかし、トーストを正しく使うにはUWPで作るしかないように思われました。FormをWindows Application Packaging ProjectでUWP化する手もありますが、公開が面倒ですし、個人的にはちょっとしたアプリにインストールのような操作が発生するのが好きではありません。
#実装方法の選択
結果的にどうしたかと言うと、お行儀が悪く、かつその為にそのうち動作しなくなる可能性もありますが、Formで作りFormのままトーストの表示を行う方法を選択しました。
#手順(VisualStudio2019 Form .Net4.7.2)
Formプロジェクトを右クリックして「プロジェクトのアンロード」
アンロードしたプロジェクトを右クリックして「編集*.csproj」
TargetFrameworkVersionの下あたりに以下を追記
<TargetPlatformVersion>8.0</TargetPlatformVersion>
アンロードしたプロジェクトを右クリックして「プロジェクトの再読み込み]
Formプロジェクトを右クリックして「追加」から「参照」
Windowsから「Windows.Data」と「Windows.UI」をチェック
更に参照から以下(例)を追加してチェック
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades\System.Runtime.dll
#コード
using Windows.UI.Notifications;
var type = ToastTemplateType.ToastText01;
var content = ToastNotificationManager.GetTemplateContent(type);
var text = content.GetElementsByTagName("text").First();
text.AppendChild(content.CreateTextNode("Toast"));
var notifier = ToastNotificationManager.CreateToastNotifier("Microsoft.Windows.Computer");
notifier.Show(new ToastNotification(content));
CreateToastNotifierの引数が「お行儀が悪く」の部分です。既存のAppUserModelIdを拝借します。その中でも恐らく確実に存在するであろうものを狙って使います。
元々引数なしでもトースト通知の表示が出来たらしいので、今後こうした方法もダメになりそうな気がします。なお、UWPであれば現バージョンでも引数なしでトースト通知が出来ます。
#参考
Formアプリでトースト通知を使う [C#/.NET]
http://aziogroup.blogspot.com/2016/04/cnet.html
Fall Creators Updateを適用するとトースト通知できなくなる
https://qiita.com/akiqsinco/items/0c0d5ae4abc756a594b3
WPF などの .NET Framework のアプリから UWP の API を呼ぶ
https://blog.okazuki.jp/entry/2018/03/29/101601
#余談
開発者が知っておくべき、ライブラリとしてのWindowsランタイム (2/5)
https://www.atmarkit.co.jp/ait/articles/1304/26/news058_2.html
もう2013年と古い記事ですが、「参照するアセンブリについて」の部分が気になりました。
また、詳しく調べていませんが、Windows.winmdは現バージョンだとWindowsから選択できるため不要なのでは?と思います。
#捕捉
トーストへのクリックを処理したいのなら、この記事に書いてある内容では実現できません。
以下を最初から最後まできちんと対応すべきだと思われます。
https://docs.microsoft.com/ja-jp/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop
ただし、この場合は所謂「インストール」が何等かの形で行われる必要があるため、今回の要求は満たせないようです。
あと、タスクトレイというのはどうも正しくない表現だそうです。
https://www.atmarkit.co.jp/ait/articles/1604/19/news009.html
個人的な結論としては、Win10らしい機能が使いたければ大人しくUWPを使いましょう。です。