• 在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,//设置通知的声音
    
                    //三个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

    微软官方介绍:https://docs.microsoft.com/zh-cn/windows/apps/design/shell/tiles-and-notifications/send-local-toast?tabs=uwp

    《参考链接》

    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

    出处:https://blog.csdn.net/catshitone/article/details/78522931

    ==========================================================================================

    个人练习

    我的开发环境是VS2017 ,使用framework4.6.1的环境,新建WinForm和wpf应用测试。

    在项目的引用里,通过NuGet搜索并添加Microsoft.Toolkit.Uwp.Notifications的引用,我这里选择的版本是7.1.2,添加完成后,编译项目,会出现如下错误提示:

    错误:  Must use PackageReference

    解决方案:

    需要在项目中的将packages.config迁移到PackageReference,具体操作如下:

    Solution Explorer->右键单击References->“将packages.config迁移到PackageReference”

     再次编译,显示编译成功了。

  • 相关阅读:
    JAVA闰年测试与解决非法输入
    Junit介绍与实现
    等价类划分方法的应用
    使用Visual Studio 2013进行UI自动化测试
    简谈软件测试
    【Software Project Management】Quizs
    White box testing
    peer review
    闰年问题
    热烈庆贺清明小长假的到来
  • 原文地址:https://www.cnblogs.com/mq0036/p/15904924.html
Copyright © 2020-2023  润新知