8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Win向け通知アプリにトーストを使う

Last updated at Posted at 2019-04-03

#概要
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を拝借します。その中でも恐らく確実に存在するであろうものを狙って使います。
toast.png
元々引数なしでもトースト通知の表示が出来たらしいので、今後こうした方法もダメになりそうな気がします。なお、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を使いましょう。です。

8
9
1

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
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?