#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)