技術

Windows 10 のアクションセンターにC#で通知を表示してみた

Windows 10を使い始めてから画面の右側に表示されるアクションセンターについて、通知領域としてなんか良さそうだなぁと思っていたのですが、私が使ってるソフトだとほとんど対応してなくてもったいないなぁと思っていました。
その辺ストアアプリだと当たり前のように対応してるんでしょうけどね…デスクトップアプリしか使わないので…
デスクトップアプリについてはオープンソースでもない限りそれぞれの開発者さんの対応を待つしかないとは思うんですが、自力で実装する際に具体的にどうやったらデスクトップアプリでアクションセンターに通知を表示できるのか知りたかったので試してみました。
個人的なメモです。

まず、Visual Studio 2015の新しいプロジェクトのテンプレートから”Visual C#”→”Windows”→”クラシックデスクトップ”→”Windowsフォームアプリケーション”でプロジェクトの雛形を作成。

そしたら一旦VSを終了し、以下の説明に従ってWinRT APIを使用できるよう設定。
デスクトップ アプリからのWinRT API利用 | ++C++; // 未確認飛行 C ブログ

プロジェクトにimagesというフォルダを追加してその中にicon.pngという名前で適当な画像を追加。
これは通知に表示するための画像。
画像のプロパティ”出力ディレクトリにコピー”を”新しい場合はコピーする”にする。

そしたらフォーム(Form1.cs)にボタンをいっこ置き、そのクリックイベントでアクションセンターに通知を送るコードを追加。
Form1.csの内容は以下のとおり。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Windows.UI.Notifications;
using System.Xml;
using System.IO;
using System.Diagnostics;

namespace NotificationTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var tmpl = ToastTemplateType.ToastImageAndText02;
            var xml = ToastNotificationManager.GetTemplateContent(tmpl);

            Debug.WriteLine(xml.GetXml());
            /* ToastImageAndText02の場合
            <toast>
                <visual>
                    <binding template="ToastImageAndText02">
                        <image id="1" src=""/>
                        <text id="1"></text>
                        <text id="2"></text>
                    </binding>
                </visual>
            </toast>
            */

            var images = xml.GetElementsByTagName("image");
            var src = images[0].Attributes.GetNamedItem("src");
            src.InnerText = "file:///" + Path.GetFullPath("images\\icon.png");

            Debug.WriteLine(src.InnerText);

            var texts = xml.GetElementsByTagName("text");
            texts[0].AppendChild(xml.CreateTextNode("Action Centerのテスト"));
            texts[1].AppendChild(xml.CreateTextNode("あああああああああああああああ"));

            var toast = new ToastNotification(xml);

            ToastNotificationManager.CreateToastNotifier("NotificationTest").Show(toast);
        }
    }
}

後は実行し、ボタンを押すと次のような感じで通知が表示される。
actioncentertest1

actioncentertest2

参考

Quickstart: Sending a toast notification from the desktop (Windows)
ToastTemplateType enumeration – Windows app development
デスクトップ アプリからのWinRT API利用 | ++C++; // 未確認飛行 C ブログ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください