原文:【wpf】在win10系统上弹出toast和notification

老规矩,先看效果

右下角的notification

操作中心的notification

整体效果

前提条件

1.需要在开始菜单里添加快捷方式。

2.在注册表里注册你实现了INotificationActivationCallBack接口的com组件。

3.一个APP_ID,添加到快捷方式里,ActionCenter会以此来区分不同应用的消息。

缺一不可,不然弹出的notification没法交互。

实现

1.添加相关引用
编辑你项目的csproj文件,添加如下节点

<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>

然后看起来就是这个样子:

接下来打开引用管理器你会发现左边多了一个Windows选项卡,然后添加图示的三个引用:

然后再添加System.Runtime和System.Runtime.InteropServices.WindowsRuntime引用。

这两个引用在:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\文件夹中,如果你的.net 4.5.2的framework请改为v4.5.2。

2.添加快捷方式

private void InstallShortcut(String shortcutPath, String exePath){IShellLinkW newShortcut = (IShellLinkW)new CShellLink();newShortcut.SetPath(exePath);newShortcut.SetWorkingDirectory(Path.GetDirectoryName(exePath));IPropertyStore newShortcutProperties = (IPropertyStore)newShortcut;PropVariantHelper varAppId = new PropVariantHelper();varAppId.SetValue(APP_ID);newShortcutProperties.SetValue(PROPERTYKEY.AppUserModel_ID, varAppId.Propvariant);PropVariantHelper varToastId = new PropVariantHelper();varToastId.VarType = VarEnum.VT_CLSID;varToastId.SetValue(typeof(NotificationActivator).GUID);newShortcutProperties.SetValue(PROPERTYKEY.AppUserModel_ToastActivatorCLSID, varToastId.Propvariant);ShellHelpers.IPersistFile newShortcutSave = (ShellHelpers.IPersistFile)newShortcut;newShortcutSave.Save(shortcutPath, true);}

3.注册com组件

private void RegisterComServer(String exePath){string regString = String.Format("SOFTWARE\\Classes\\CLSID\\{{{0}}}\\LocalServer32", typeof(NotificationActivator).GUID);var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(regString);key.SetValue(null, exePath);}

这样ActionCenter就可以通过GUID找到你的exe文件。
4.设置通知的内容样式
通知的样式有很多种,图片、文字、按钮、输入框可以组合使用。详情见最下面的参考链接。
这里我贴出下我例子里的布局设置。

private void btncl(object sender, RoutedEventArgs e){ToastContent content = new ToastContent(){Visual = new ToastVisual(){BindingGeneric = new ToastBindingGeneric(){Children ={new AdaptiveText(){Text="New Mirrored Folders Created"//标题},new AdaptiveText(){Text="Drag some files to either Mirror folder to sync\nClick to show the Mirror folder on my..."//内容}},AppLogoOverride = new ToastGenericAppLogo(){Source = new System.Uri(System.IO.Path.GetFullPath("123.png")).AbsoluteUri//通知的图标}}},Scenario = ToastScenario.Alarm,//设置通知的声音//三个buttonActions = new ToastActionsCustom(){Buttons ={new ToastButton("PC",new QueryString(){{"action","fileExplorer" },{"path","c:\\" }}.ToString()){ActivationType=ToastActivationType.Background},new ToastButton("Drive",new QueryString(){{"action","fileExplorer" },{"path","d:\\" }}.ToString()){ActivationType=ToastActivationType.Background},new ToastButtonDismiss("Close")}}};XmlDocument xml = new XmlDocument();xml.LoadXml(content.GetContent());ToastNotification toast = new ToastNotification(xml);toast.Group = "gg";//toast.ExpirationTime = DateTime.Now.AddSeconds(20);//toast.SuppressPopup = true;ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast);}

这里用到了两个库,分别是:

安装完成后,添加引用即可。
1. 里面的QueryString.NET库,是将key-value形式的集合,序列化成一个字符串,因为Notification里的button只接受一个为string类型的arguments。用户点击某个button时,会回调你com组件的Activie方法,在这个方法里拿到arguments,然后进行下一步操作。
2. 如果你不想让右下角弹出通知,只想让通知出现在“操作中心”(通知栏)里,可以设置toast.SuppressPopup=true来进行屏蔽。不过此时是没法播放声音的。
3. 关于如何让通知常驻在”操作中心“这个问题,我发现是不可能的,微软说了”当用户与通知进行交互的时候会自动把这条通知从 操作中心移除“,所以那个toast.ExpirationTime基本没啥作用。(详见下面参考链接)。如果设置了Scenario = ToastScenario.Alarm(Reminder/IncomingCall);用户不点击的话,会一直出现在那里,否则7-8秒后自动消失。

5.程序退出时,清除通知
在退出时调用:

ToastNotificationManager.History.RemoveGroup(....);
//或者
ToastNotificationManager.History.Remove(....)

即可。这样可以删除同属于一个Group的通知,或者删除某个tag=”xxx”的通知,或者整个app_id下的通知。

6.如何做到多个win系统的兼容?
一般你的程序是同时支持win7,win8,win10等的,而win7是无法弹出这种样式的通知的,所以这些引用不能直接添加到主程序里,不然运行时就会报错。
正确的做法就是:将ToastNotification单独做成一个dll,在程序中加入系统版本检测的方法,如果是win10系统,再通过反射的方式,将dll加载到主程序集,然后再弹出通知。


附件:Demo。 如果失效,请留言或来信索取376720513@qq.com

如果你想更灵活的控制弹出的通知,可以参考我这篇博客:【WPF】右下角弹出自定义通知样式(Notification)——简单教程


2018-03-09更新:
NND,今天发现微软更新了一篇又详细的文章,介绍的很好,简直手把手教你。
想看的请移步:Send a local toast notification from desktop C# apps

《参考链接》

1.Quickstart: Handling toast activations from Win32 apps in Windows 10
2.github/desktop-toasts
3.Adaptive and interactive toast notifications
4.Send a local toast notification

【wpf】在win10系统上弹出toast和notification相关推荐

  1. 组策略 计算机 用户账户控制,Win10系统总是弹出用户账户控制提示是否允许程序修改计算机的解决方法...

    Win10系统总是弹出用户账户控制提示"是否允许程序修改计算机"的解决方法 不少使用Win10系统的用户都会遇到这样一个问题:当我们打开程序时,系统总会弹出"你要允许以下 ...

  2. 计算机开机时候远程过程调用失败怎么办,win10系统开机弹出对话框“远程过程调用失败且未执行”的技巧介绍...

    今天和大家分享一下win10系统开机弹出对话框"远程过程调用失败且未执行问题的解决方法,在使用win10系统的过程中经常不知道如何去解决win10系统开机弹出对话框"远程过程调用失 ...

  3. win10开机有东西一闪而过_Win10系统开机弹出CMD一闪而过怎么回事_Win10系统开机后cmd窗口一闪而过如何处理...

    最近有win10系统用户反映说电脑在开机的时候,突然弹出一个cmd窗口,有时候会一闪而过,很多用户不知道怎么回事,针对这个问题,小编就给大家讲解一下Win10系统开机后cmd窗口一闪而过得到详细处理方 ...

  4. 如何在win10系统上使用旧版本的IE浏览器

    win10系统打开IE浏览器自动变成了Edge浏览器,切换成IE模式时,IE浏览器的版本默认为IE11(注:Edge浏览器只支持IE11),有些网站只能使用IE浏览器打开或者在做一些兼容性测试时,需要 ...

  5. win10的计算机服务器,Tomcat服务器怎么在Win10系统上搭建-电脑自学网

    Tomcat服务器也是经常被用到的一种比较简单的服务器,那么Win10系统怎么配置Tomcat服务器呢?Tomcat服务器怎么在Win10系统上搭建?下面给大家介绍具体的操作步骤. 搭建方法: 必要前 ...

  6. 解决Pr在win10系统上安装不上问题 Pr2021版-Premiere Pro 2021中文正式版安装教程

    Adobe Premiere Pro 2021 for mac 15.2 是一款专业的视频剪辑软件,Premiere Pro 2021 集成了视频采集.剪辑.调色.美化音频.添加字幕等功能,可以帮助你 ...

  7. chrome关闭硬件加速_在Win10系统上怎么关闭Chrome浏览器的硬件加速

    正常在Win10系统上打开一个网页的时间也就是一两秒,但是最近有位用户表示自己每次在Win10系统上用Chrome浏览器打开网页都非常慢,这个如果排除了网速和打开的对象网站不存在问题的话,那就只有一个 ...

  8. 计算机主机光驱弹不出来怎么办,老司机教你win10系统光驱弹不出来的操作步骤...

    也许大家在用电脑工作的使用中会遇到win10系统光驱弹不出来的情况,即便很容易处理,还是有朋友不知道win10系统光驱弹不出来到底如何处理.因此我就在电脑上整顿出win10系统光驱弹不出来的解决办法, ...

  9. w7系统计算机网络密码是什么,解答win7系统共享弹出Windows安全窗口提示输入网络密码的详细教程...

    随着电脑的使用率越来越高,我们有时候可能会遇到win7系统共享弹出Windows安全窗口提示输入网络密码问题,如果我们遇到了win7系统共享弹出Windows安全窗口提示输入网络密码的问题,要怎么处理 ...

最新文章

  1. NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用
  2. 7 Papers Radios | NeurIPS 2020最佳论文;全卷积网络实现E2E目标检测
  3. 你不知道的CSS单位
  4. 在Linux/Centos下用wondershaper限速
  5. 【51nod - 1050】循环数组最大子段和(dp)
  6. 二维码扫描利用ZBar实现
  7. java中如何定位文本框_div定位在文本框下
  8. 基于JAVA+Spring+MYSQL的码头船只出行管理系统
  9. tcp报文 如何判断是否为握手_“三次握手,四次挥手”你真的懂吗?
  10. java项目:基于springboot高校党建管理系统(springboot+vue+mysql+redis) 1010
  11. python imshow彩色_matplotlib实现显示伪彩色图像及色度条
  12. Windows 中剪贴板的操作
  13. 深圳云计算培训:专科生学习云计算就业前景如何?
  14. 用Maple求偏导数
  15. [源码阅读]解析Anime(JS动画库)核心(2)
  16. 红米note5刷android,红米Note5 安卓9.0 解锁Bootloader-刷入第三方TWRP_Recovery 获取完整ROOT教程...
  17. JavaScript - navigator对象
  18. 基于FPGA的深度卷积神经网络的加速器设计
  19. setenv setfenv
  20. IOS端微信小程序API播放视频无效,应该这样做

热门文章

  1. 滚动条组件 http://www.w3cfuns.com/notes/15098/96195b77bdbcb601590f67f971770bb8.html
  2. Java复习之网络编程
  3. 3-4笔刷的详细设定
  4. [翻译]下拉列表多选控件MultiDropDown
  5. 光驱安装centos7系统过程_centos7可以ping通外网_可以ping通内网其他机器_但是其他机器就是ping不通centos7_太神奇了---linux工作笔记041
  6. Sharding-JDBC读写分离_MySql主从配置(1)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记015
  7. matlab | 与 || 的区别
  8. 2015-12-01 视图
  9. 运维跟开发一定有仇么?
  10. editplus设置不生成备份文件_删库不跑路,手把手教你MySQL数据恢复