Windows 10 Toast Notifications 实现指南

Windows 10操作系统中,Toast通知是一种非常有效的用户界面元素,用于向用户显示临时信息。与早期的气球通知相比,Toast通知即使在从屏幕上消失后,也可以在操作中心保留,这允许应用程序将通知保留更长时间(最长可达3天),并允许用户稍后对其进行响应。

根据微软的快速指南(),如果希望在应用程序不再运行时响应Toast激活,需要一个COM服务器来激活应用程序。这需要编写一些不太友好的C#代码。如果不喜欢这种方法,还有一种更简单且令人惊讶地没有在任何地方提及的方法来“唤醒”应用程序,当Toast被激活时。

异步可插拔协议来拯救

Windows允许使用所谓的URL协议来启动应用程序。可能已经知道一些这样的协议,比如http:或ftp:。如果使用Process.Start("http://www.google.com"),字符串的第一部分(http)被识别为URL协议,与某个特定应用程序相关联。已经预定义了几个协议,但可以很容易地添加自己的协议,并将其与应用关联,如所述:

private void RegisterProtocol(string exePath) { RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\Classes\\" + urlProtocol); if (key == null) { key = Registry.CurrentUser.CreateSubKey("Software\\Classes\\" + urlProtocol); key.SetValue(string.Empty, "URL: " + urlProtocol); key.SetValue("URL Protocol", string.Empty); key = key.CreateSubKey(@"shell\open\command"); key.SetValue(string.Empty, exePath + " " + "%1"); } key.Close(); }

这为什么对感兴趣?如果查看定义Toast通知的XML,会注意到一个名为“activationType”的参数,其值“protocol”对特别有趣。如果使用这个值,需要指定一个字符串来启动这个URL协议。为此,使用属性“launch”(或者如果在动作中使用它,使用“arguments”)。

<toast launch="my-cool-app:arguments_for_my_app" activationType="protocol"> <visual> <binding template="ToastGeneric"> <text> My test app using protocol </text> </binding> </visual> </toast>

使用代码

上面的Toast定义将导致每次用户点击通知时,Windows都会尝试使用为Toast提供的参数启动应用程序(这与COM激活方法不同,后者让Windows知道应用程序正在运行)。然而,不想在应用程序已经在运行时再次启动应用程序,因为有事件响应Toast动作。

ToastNotification toast = new ToastNotification(dom); toast.Activated += Toast_Activated; ToastNotificationManager.CreateToastNotifier(myAppID).Show(toast);

为了确保Toast不会再次启动应用程序,需要实现一个互斥锁,以保持只有一个应用程序实例在运行。如果Windows尝试启动应用程序的新实例,将在初始化任何内容之前简单地关闭它并忽略它。

public MainWindow() { bool createdNew; _mutex = new Mutex(true, AppName, out createdNew); if (!createdNew) { Application.Current.Shutdown(); } else { InitializeComponent(); // 其他内容 } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485