wpf在win10系统上弹出toast和notification

JimCarter JimCarter     2022-10-01     233

关键词:

老规矩,先看效果

右下角的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,//设置通知的声音

                //三个button
                Actions = 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中popup控件在win7以及win10等中的对齐点方式不一样的解决方案-简书

...目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是弹出在左边,Win7上是弹出在右边)。现在记录解决方案于此:修改弹出菜单相对于相应菜单项是左对齐还是右对齐//解决Popup控件在Win7以及... 查看详情

在 Chrome 上弹出处理 windows 身份验证

】在Chrome上弹出处理windows身份验证【英文标题】:HandlewindowsauthenticationpopuponChrome【发布时间】:2013-10-2120:45:41【问题描述】:我正在尝试使用AutoIt为我的Seleniumwebdriver脚本处理弹出的基本身份验证。我为Firefox和InternetExplorer编写... 查看详情

toast拓展--自定义显示时间和动画

...示时间和动画我们在Android应用开发中经常会需要在界面上弹出一个对界面操作无影响的小提示框来提示用户一些信息,这时候一般都会使用Android原生的Toast类Toast.makeText(mContext,"消息内容",Toast.LENGTH_SHORT).show();一开始觉得,挺好... 查看详情

允许 webdriver 浏览器从 Windows 10 服务在桌面上弹出

】允许webdriver浏览器从Windows10服务在桌面上弹出【英文标题】:AllowwebdriverbrowsertopopupondesktopfromWindows10Service【发布时间】:2019-02-2019:30:48【问题描述】:所以我的理解是,从WindowsVista开始,他们已禁用Windows服务以与桌面交互,... 查看详情

安卓toast

概述一个toast是在屏幕上弹出一条信息,它的大小总是包裹着需要显示的内容,并且当前的Activity依然是可见并且可互动的。toast会自动消失,并且不接受任何互动事件。因为toast可以在后台的 Service 中创建,所以... 查看详情

WPF 本机 Windows 10 祝酒词

...为此制作自定义对话框,但必须有一种方法可以通过操作系统来实现。【问题讨论】:我实际上使用了那个库,现在我只需要找出方法在哪里;/@AbinMathewMetro.Mahap 查看详情

UICollectionView 和 UITableView 在 UINavigationController 上弹出后调用 scrollViewDidScroll

】UICollectionView和UITableView在UINavigationController上弹出后调用scrollViewDidScroll【英文标题】:UICollectionViewandUITableViewcallsscrollViewDidScrollafterapoponUINavigationController【发布时间】:2014-06-1014:50:15【问题描述】:我的情况:我有一个视图控... 查看详情

Sencha 在列表 itemtap 上弹出

】Sencha在列表itemtap上弹出【英文标题】:Senchapopoveronlistitemtap【发布时间】:2011-10-2013:00:16【问题描述】:在我的应用程序中,我有一个列表。我想在点击一个项目时显示一个弹出(覆盖)。它适用于某些项目,但对于某些项目... 查看详情

androidnotification与toast

    其中第2个和第3个Notification使用的是同一个ID(R.drawabgle.why),因此,第3个Notification会覆盖第2个Notification。  在显示Notification时还可以设置显示通知时的默认发声、震动和Light效果。要实现这个功能需要设置N... 查看详情

WPF 桌面应用程序,Windows 10 通知 Toast 2016(UWP 社区工具包)

】WPF桌面应用程序,Windows10通知Toast2016(UWP社区工具包)【英文标题】:WPFDesktopApp,Windows10NotificationToast2016(UWPCommunityToolkit)【发布时间】:2017-02-0605:54:56【问题描述】:我正在尝试使用我的WPFC#桌面应用程序显示Windows10Toast。遗憾... 查看详情

安卓toast

概述一个toast是在屏幕上弹出一条信息,它的大小总是包裹着需要显示的内容,并且当前的Activity依然是可见并且可互动的。toast会自动消失,并且不接受任何互动事件。因为toast可以在后台的 Service 中创建,所以... 查看详情

电脑win10系统怎么一键还原

1、在“系统保护”界面中点击“系统还原”。2、在弹出的系统还原提示窗口点击下一步。3、点击显示更多还原点,还可看到系统在进行更新后自动创建的还原点。4、先选择某个还原点,双击即可看到,在系统还原到该点之后... 查看详情

为啥在终端上写 ppm 时会在终端上弹出 Perl 包管理器而不是 ppm>

】为啥在终端上写ppm时会在终端上弹出Perl包管理器而不是ppm>【英文标题】:WhyitpopupsPerlPackageManagerinsteadofppm>onterminalonwrittingppmatterminal为什么在终端上写ppm时会在终端上弹出Perl包管理器而不是ppm>【发布时间】:2015-01-0705:1... 查看详情

ReactJS + Flux - 如何实现 toasts/notifications?

】ReactJS+Flux-如何实现toasts/notifications?【英文标题】:ReactJS+Flux-Howtoimplementtoasts/notifications?【发布时间】:2015-06-2111:29:46【问题描述】:我正在尝试理解Flux和Reactjs。考虑以下一个非常简单的场景:您有一个输入很少的表单。当... 查看详情

Python toast 通知未传播到操作中心

】Pythontoast通知未传播到操作中心【英文标题】:PythontoastnotificationsnotpropagatingtoActionCenter【发布时间】:2018-04-2114:32:17【问题描述】:我正在尝试通过https://github.com/jithurjacob/Windows-10-Toast-Notifications/提供的win10toastpython库在Windows10... 查看详情

推送通知不会在 Android 上弹出

】推送通知不会在Android上弹出【英文标题】:Pushnotificationdoesn\'tpopuponAndroid【发布时间】:2021-03-0820:09:05【问题描述】:我正在创建使用FCM发送推送通知的颤振应用程序。我通过向设备发送JSON来从网站发送带有CloudFunctions的通知... 查看详情

win10ip地址怎么设置

参考技术A右键Win10系统桌面上的网络,点击弹出菜单上的属性。点击网络和共享中心窗口上的以太网。点击以太网状态对话框上的“属性”。在以太网属性上找到TCP/IP协议v4并双击打开。在弹出对话框中勾选使用下面的IP地址和... 查看详情

win10的通知栏没有了那些快捷键,显示的为notification,像乱码一样,求大神求救!!!!!

参考技术A系统有问题了。直接换个验证过的系统盘重装系统就行了,这样就可以全程自动、顺利解决win10系统运行异常的问题了。用u盘或者硬盘这些都是可以的,且安装速度非常快。具体安装方法如下:1、U盘安装:用ultraiso软... 查看详情