在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();
// 其他内容
}
}