コンソールプログラムでトースト通知を実現するサンプルコードがネット上にありましたが
トースト通知を依頼し(ToastNotifier.Show)、作成したコンソールプログラムが終了すると何も表示されません。
トースト表示がされる(終わる)まで待たないといけないようです。
もちろん、Sleepなどを入れれば表示されますが…
''本資料では、トースト通知が表示されイベントが戻ってきてコンソールプログラムが終了するようになっています。
イベントはトースト通知を閉じたり、トースト通知表示後、通知が隠れるとイベントが発生します。''
本コンソールプログラムのプロジェクトは以下のURL(GitHub)に公開してあります。
https://github.com/oss-sakura/Toast4U
ソースコードは以下の参考記事サイトに公開されているコードを流用させた頂きました。(感謝)
コンソールプログラムからトースト通知をするプロジェクトを以下の手順で作成します。
<PropertyGroup> <TargetPlatformVersion>8.0</TargetPlatformVersion> </PropertyGroup>35行目~37行目に追記しました。
%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
以上の操作でプロジェクトの作成は完了です。
以下のサンプルコードを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;
}
}
}
上記のプロジェクトを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
実際にタイトル、メッセージと画像を表示するコマンド例を以下に記します。
Toast4U.exe トースト通知 こんにちは世界
適当なイメージファイルを準備してください。
Toast4U.exe HODL "Bitcoin To The Moon" D:\BTC.png
トースト通知に使用したXMLですが、ToastTemplateType.ToastText01, ToastTemplateType.ToastImageAndText01を参考にしました。
<toast><visual><binding template="ToastText01"><text id="1"></text></binding></visual></toast>
<toast><visual><binding template="ToastImageAndText01"><image id="1" src=""/><text id="1"></text></binding></visual></toast>
以上、コンソールアプリケーションからトースト通知を送信し完了するまで待つサンプルコードでした。