2021年3月1日月曜日

micro:bitで玄関チャイムをWindowsのトースト通知に変換

 micro:bitでBeacon通知をするプログラムを作ったのは、実は、玄関のチャイムの音を「視覚化」するためだった。仕事部屋で音楽などを少し大きな音量で聞いていたり、ヘッドホンを使っていると玄関チャイムの音が聞こえないことがある。なので、micro:bitで音を検出して、これをBluetooth Beaconで通知、受信したWindows側のプログラムでトースト通知を行えば、視覚化が可能だろうと考えた。

 micro:bitを使ったBleutoothによるPCへの通知に関しては、ブログの以下のページで解説している。

micro:bitのBluetoothアドバタイズを使う

Windows10でEddyStone Beaconを受信する その1

Windows10でEddyStone Beaconを受信する その2 メインルーチン編

Windows10でEddyStone Beaconを受信する その3 イベントハンドラ編

 これまでのサンプルコードでは、WinRTを呼び出しているので、以下のようにVisual Studio 2019からMicrosoft.Windows.SDK.Contractsを呼び出せるように設定しておく必要がある。今回のトースト通知もWinRTなので、設定が必要である。

Win32デスクトップアプリでWinRT APIを呼び出す(Visual Studio 2019での設定方法)

さて、コンソールプログラム(ただしC#のマネージコード)からトースト通知を行うには、以下のようなコードを使うのが最も簡単。

var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var textNodes = template.GetElementsByTagName("text");
textNodes.Item(0).InnerText = "呼び鈴が鳴っています";
var notifier = ToastNotificationManager.CreateToastNotifier("玄関チャイム通知システム");
var notification = new ToastNotification(template);	
// トースト通知を表示する
notifier.Show(notification);

 トースト通知は、ToastNotificationManager Classを使う。まずは、表示するコンテンツ(通知本体。notification)が必要だが、トースト通知では本文をXMLで指定する。Windowsは、雛形となる本文テンプレートを持っていて、それを取り出すのが「GetTemplateContent」である。テンプレートには、画像付き(ToastImageAndText01~04)、テキストのみ(ToastText01~04)がある。サンプルはMicrosoftのサイトにある。

 GetTemplateContentは、引数で指定したテンプレートのXmlDocumentを返す。ここでは、先頭行が太字テキスト、通常文字のテキストが2~3行目に入る「ToastText02」を選んだ。なお、これとは別にトースト通知は、上にタイトルが入るようになっているが、これは、CreateToastNotifierで指定する。

得られるのは、以下のようなXMLだ。
<toast>
  <visual>
    <binding template="ToastText02">
      <text id="1"></text>
      <text id="2"></text>
    </binding>
  </visual>
</toast>

となる。取り出したテンプレートをXMLとして得るには、templateに対してgetXML()メソッドを適用する。たとえば、Visual Studioのウォッチ式なら"template.GetXml()"を設定する。

 これをリストの3行目"textNodes.Item(0).InnerText"で書き換えたのが以下のXMLである。書き換えたのは太文字で表示される1行目のtextのほうである。

<toast>
  <visual>
    <binding template="ToastText02"> 
      <text id="1">呼び鈴が鳴っています</text>
      <text id="2"></text>
    </binding>
  </visual>
</toast>

 次にトースト通知のイスタンスNotifierToastNotificationManager.CreateToastNotifierとテンプレートを利用してトースト本文ToastNotificationを作成する。最後に、NotifierのShowメソッドで引数にNotificationを指定すれば、以下のような通知が表示される。



0 件のコメント:

コメントを投稿