#author("2021-09-11T22:24:51+09:00","","")
#author("2021-09-11T22:25:11+09:00","","")
#navi(../)
* コンソールプログラムからトースト通知をするサンプル [#da0f9bd0]
コンソールプログラムでトースト通知を実現するサンプルコードがネット上にありましたが~
トースト通知を依頼し(ToastNotifier.Show)、作成したコンソールプログラムが終了すると何も表示されません。~
トースト表示がされる(終わる)まで待たないといけないようです。~
もちろん、Sleepなどを入れれば表示されますが…

''本資料では、トースト通知が表示されイベントが戻ってきてコンソールプログラムが終了するようになっています。~
イベントはトースト通知を閉じたり、トースト通知表示後、通知が隠れるとイベントが発生します。''

#contents

* GitHubに公開 [#va22be52]
本コンソールプログラムのプロジェクトは以下のURL(GitHub)に公開してあります。~
https://github.com/oss-sakura/Toast4U~
ソースコードは以下の参考記事サイトに公開されているコードを流用させた頂きました。(感謝)

#contents
#htmlinsert(windev-top.html)

* 動作確認&開発環境 [#r260a506]
- Windows 10 ver. 21H1
- Visual Studio 2019
- .NET Framework 4.7.2

* 参考記事 [#j39dafe4]
-Windows10の通知テンプレート(ToastTemplateType)XMLを確認してみた~
https://decodelog.com/net-toast-tamplate/
-C# UWP toast notification event handlers not being called in Release mode. Works in Debug mode~
https://stackoverflow.com/questions/66360108/c-sharp-uwp-toast-notification-event-handlers-not-being-called-in-release-mode

* コンソールプログラムでトースト通知プロジェクトを作る手順 [#y71c4cc6]
コンソールプログラムからトースト通知をするプロジェクトを以下の手順で作成します。

** プロジェクトの作成 [#o588c46c]
+ Visual Studio 2019 の起動します。
+ 新しいプロジェクトの作成 をクリックします。
#ref(01.png)
#br
+ コンソールアプリ(.NET Framework)を選択し「次へ」ボタンをクリックします。
#ref(02.png)
#br
+ プロジェクト名に Toast4U と入力します。
+ 場所は皆さんの環境にあった場所を指定してください。(もちろんデフォルトでもかまいません。)
+ 入力が完了したら「作成」ボタンをクリックします。
#ref(03.png)
#br
+ プロジェクト画面が表示されます。

** WinRTを参照できるようにする [#oa44a2ca]
+ ソリューションエクスプローラーにある「Toast4U」プロジェクトを右クリックします。
+ 「プロジェクトのアンロード」をクリックします。
#ref(04.png)
#br
+ Toast4U.csproj ファイルが表示されます。
#ref(05.png)
#br
+ Toast4U.csproj に以下の文字列を追記します。
  <PropertyGroup>
    <TargetPlatformVersion>8.0</TargetPlatformVersion>
  </PropertyGroup>
35行目~37行目に追記しました。
#ref(06.png)
#br
+ 追記が終わったら、Ctrl + S またはフロッピーディスクのアイコンをクリックし保存します。
#br
+ ソリューションエクスプローラーにある「Toast4U」プロジェクトを右クリックします。
+ 「プロジェクトの再読み込み」をクリックします。
#ref(07.png)
#br

** 必要な参照を追加 [#rf28995c]
+ ソリューションエクスプローラーに表示されている「参照」を右クリックします。
+ 「参照の追加」をクリックします。
#ref(11.png)
#br
+ Window をクリックします。~
もし、Windowが表示されていない場合は、プロジェクトのアンロード、プロジェクトの再読み込みをしてみてください。
+ Windows.Foundation, Windows.Data, Windows.UI の3つをクリックします。
#ref(12.png)
#br
+ System.Runtime.dll 以下の手順で参照に含めます。
+ 参照ボタンをクリックします。
#ref(13.png)
#br
+ 以下のフォルダににある System.Runtime.dll を選択します。(.NET Framework 4.7.2使用)
 %ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades
ほとんどの方はCドライブにWindowsをインストールしていると思いますので下のパスになります。
 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades
+ System.Runtime.dll を選択し追加ボタンをクリックします。
#ref(14.png)
#br
+ これで参照は終わりです。~
OKボタンをクリックします。
#ref(15.png)

以上の操作でプロジェクトの作成は完了です。

* コンソールアプリケーションによるトースト通知サンプルコード [#zdc8ef35]
以下のサンプルコードをProgram.csに適用してください。

本コンソールプログラムのプロジェクトは以下のURL(GitHub)に公開してあります。~
https://github.com/oss-sakura/Toast4U~

 using System;
 using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 using Windows.Data.Xml.Dom;
 using Windows.UI.Notifications;
 
 namespace Toast4U
 {
     class Program
     {
         static void Main(string[] args)
         {
             if (!(args.Length == 2 || args.Length == 3))
             {
                 Usage();
                 return;
             }
 
             if (args.Length == 3 && !(File.Exists(args[2])))
             {
                 Console.Error.WriteLine("{0} image file not found!", args[2]);
                 return;
             }
 
             Toaster toaster = new Toaster();
             Task.Run(() => toaster.SendToastNotification(args));
 
             while (toaster.Finished == false)
             {
                 Thread.Sleep(10);
             }
         }
 
         static void Usage()
         {
             string command = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
             Console.WriteLine("Usage: {0} title message [image]", command);
             Console.WriteLine("  e.g.: {0} INFOMATION \"HELLO WORLD\"", command);
             Console.WriteLine("  e.g.: {0} INFOMATION \"HELLO WORLD\" c:\\path\\to\\image.png", command);
         }
     }
 
     class Toaster
     {
         private ToastNotification _toast;
         public bool Finished { get; private set; } = false;
 
         public void SendToastNotification(string[] args)
         {
             string Toast = "";
             string title = args[0];
 
             switch (args.Length)
             {
                 case 2:
                     // Title and Message XML
                     Toast = String.Format(
                         "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">{0}</text></binding></visual></toast>"
                         ,args[1]);
                     break;
                 case 3:
                     // Title, Message and Image XML
                     Toast = String.Format(
                         "<toast><visual><binding template=\"ToastImageAndText01\"><image id=\"1\" src=\"{1}\"/><text id=\"1\">{0}</text></binding></visual></toast>"
                         , args[1], args[2]);
                     break;
                 default:
                     // unknown case
                     Toast = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">unknown</text></binding></visual></toast>";
                     break;
             }
 
             XmlDocument toastTemplate = new XmlDocument();
             toastTemplate.LoadXml(Toast);
 
             // Create the toast and attach event handlers.
             _toast = new ToastNotification(toastTemplate);
             _toast.Dismissed += ToastNotificationComplete;
             _toast.Activated += ToastNotificationComplete;
             _toast.Failed += ToastNotificationComplete;
 
             ToastNotificationManager.CreateToastNotifier(title).Show(_toast);
         }
 
         private void ToastNotificationComplete(ToastNotification sender, object args)
         {
             Finished = true;
         }
     }
 }

* Toast4Uの使い方 [#s24e765f]

上記のプロジェクトをGitHubからダウンロードするか、作成したプロジェクトをビルドしてください。~
ビルドすると Toast4U.exe が作成さくせされるので、コマンドプロンプトを起動しToast4U.exeのあるディレクトリに移動し、以下の操作を行ってください。

引数なしで Toast4U.exe を起動すると使用方法が出力されます。
 D:\Toast4U\Toast4U\bin\Release>Toast4U.exe
 Usage: Toast4U.exe title message [image]
   e.g.: Toast4U.exe INFOMATION "HELLO WORLD"
   e.g.: Toast4U.exe INFOMATION "HELLO WORLD" c:\path\to\image.png

実際にタイトル、メッセージと画像を表示するコマンド例を以下に記します。

** タイトル、メッセージ表示 [#sce86585]
-コマンド例
 Toast4U.exe トースト通知 こんにちは世界
#ref(21.png)

** タイトル、メッセージ、イメージ表示 [#l22ea790]
適当なイメージファイルを準備してください。~
-コマンド例
 Toast4U.exe HODL "Bitcoin To The Moon" D:\BTC.png
#ref(22.png)

* その他 [#fe10d5de]
トースト通知に使用したXMLですが、ToastTemplateType.ToastText01, ToastTemplateType.ToastImageAndText01を参考にしました。
- ToastTemplateType.ToastText01
 <toast><visual><binding template="ToastText01"><text id="1"></text></binding></visual></toast>

-ToastTemplateType.ToastImageAndText01
 <toast><visual><binding template="ToastImageAndText01"><image id="1" src=""/><text id="1"></text></binding></visual></toast>

以上、コンソールアプリケーションからトースト通知を送信し完了するまで待つサンプルコードでした。

#htmlinsert(windev-btm.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS