Windows 10 開始,在桌面右下角增加了應用程式通知功能,允許背景執行程式在桌面彈出快顯型通知,甚至還能加上圖檔、按鈕、文字輸入框,提供可互動介面。

快顯通知跟逼你閱讀後關掉的訊息對話框不同,它通常出現在畫面固定位置(例如:手機直式螢幕上下側、視窗右上角)、顯示常帶有動畫效果吸引使用者注意、訊息會在數秒後會自動消失,主打「有達到通知效果但不干擾使用者手上的操作」,很適合通知性質的訊息。(延伸閱讀:JavaScript 快顯通知套件 - NOTY)


圖片來源

我沒打算搞什麼花俏應用,就只想做到從自己寫的 Console、Desktop 或 Service 程式發通知,最好點通知時還能觸發特定動作。如此,程式多了一個跟使用者互動的管道,還能享受 Widnows 的通知管理功能,例如:關閉通知、請勿打擾、優先順序,總之兵器必須要有,用不用是我的自由。

微軟有篇教學:從 C# 應用程式傳送本機應用程式通知講得挺完整,基本上照方煎藥即可。

我用 .NET 9 開發,整理心得:

  • dotnet add package Microsoft.Toolkit.Uwp.Notifications 新增套件,new ToastContentBuilder() 再串接 AddXXX() 方法加資料加內容,最後 Show() 就大功告成。
  • 一個小眉角是 .csproj TFM 必須指定 Windows SDK 版本號碼,如:<TargetFramework>net9.0-windows10.0.17763.0</TargetFramework>,不然程式會找不到 .Show() 方法。SDK 版號主要控制編譯時的 API 相容性檢查,並非執行時期支援的最低作業系統版本,想知道有哪些版號,有個簡單做法是用 net9.0-windows10 引發編譯錯誤,錯誤訊息有完整清單:
  • .AddInlineImage() 載入 Http 圖片適用已封裝的應用程式,非 UWP 要使用較麻煩,我用不到沒多研究。
  • .AddButton() 還可加上自訂按鈕,配合 .AddArgument() 在按鈕時挾帶參數,方便程式判別按鈕來源做不同動作,教學文件有詳細範例可參考。
  • 透過 ToastNotificationManagerCompat.OnActivated += toastArgs => { ... } 可註冊使用者點擊通知的事件,會在使用者點擊通知時觸發,由 ToastArguments.Parse(toastArgs.Argument) 可取得當初透過 .AddArgument() 加入的參數。

以下是個簡單範例,輸入文字參數顯示在通知,點選時在 .NET 端接受參數,如果參數是網址就開啟

using Microsoft.Toolkit.Uwp.Notifications;
using Windows.Foundation.Collections;

ToastNotificationManagerCompat.OnActivated += toastArgs =>
{
    ToastArguments args = ToastArguments.Parse(toastArgs.Argument);
    if (args.Contains("custParam"))
    {
        string custParam = args["custParam"];
        Console.WriteLine("自訂參數值 = " + custParam);
        if (Uri.IsWellFormedUriString(custParam, UriKind.Absolute))
        {
            // 開啟 URL 
            // 資安提醒:此範例之參數均為自己輸入才可放心開啟,若 URL 來自第三方需防範惡意攻擊
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
            {
                FileName = custParam,
                UseShellExecute = true
            });
        }
    }
};

Console.WriteLine("請輸入自訂參數按 Enter 送出通知,輸入空白可結束程式...");
while (true)
{
    string? input = Console.ReadLine();
    
    if (string.IsNullOrWhiteSpace(input))
        break;

    new ToastContentBuilder()
        .AddArgument("custParam", input) // 設定自訂參數
        .AddText("通知標題")
        .AddText($"Console 發送 Windows 11 通知:{input}")
        // .AddCustomTimeStamp(DateTime.Today) // 如果要自訂標註時間
        .Show();
}
Console.WriteLine("結束程式");

ToastNotificationManagerCompat.Uninstall();

就醬,我們學會用 .NET 送出 Windows 通知囉~

同場加映用 PowerShell 發 Windows 通知的寫法,如果不想寫程式,也有現成的 PowerShell 模組,例如 PoshNotify (支援 Windows / Linux / macOS 跨平台):

Install-Module -Name PoshNotify
Send-OSNotification -Title "PS 發送測試" -Body "使用 PoshNotify Send-OSNotification 發送"

Shows how to send interactive Windows notifications from a .NET console app using Microsoft.Toolkit.Uwp.Notifications, with click actions and PowerShell alternatives.


Comments

Be the first to post a comment

Post a comment