如何使用 UWP 应用检测由另一个应用触发的 Windows 10 Toast 通知

Posted

技术标签:

【中文标题】如何使用 UWP 应用检测由另一个应用触发的 Windows 10 Toast 通知【英文标题】:How to detect windows 10 toast notification triggered by another app using a UWP app 【发布时间】:2021-11-27 07:36:52 【问题描述】:

所以我正在尝试创建一个 UWP 应用程序,它应该能够检测当前是否显示任何 Toast 通知,然后在出现时播放音频文件。我正在尝试使用 GetNotificationsAsync 方法来实现这一点,但问题是无论当前是否显示 toast 通知,该方法生成的列表总是相同的。以下是按钮中将触发该过程的代码 sn-p,是否需要执行一些额外的步骤?此外,已授予应用程序在 Windows 10 上通知的权限。

private async void Button_Click(object sender, RoutedEventArgs e)
        
            int a = 0;
            switchStatus = "ON";
            this.Status.Text = switchStatus;

            while (a == 0)
            
                // Get the listener
                Windows.UI.Notifications.Management.UserNotificationListener listener = Windows.UI.Notifications.Management.UserNotificationListener.Current;

                // And request access to the user's notifications (must be called from UI thread)
                Windows.UI.Notifications.Management.UserNotificationListenerAccessStatus accessStatus = await listener.RequestAccessAsync();

                switch (accessStatus)
                
                    // This means the user has granted access.
                    case Windows.UI.Notifications.Management.UserNotificationListenerAccessStatus.Allowed:
                        // Get the toast notifications
                        IReadOnlyList<Windows.UI.Notifications.UserNotification> notifs = await listener.GetNotificationsAsync(Windows.UI.Notifications.NotificationKinds.Toast);
                        int b = notifs.Count();
                        
                        if (b==0)
                        
                            break;
                        
                        else
                        
                            try
                            
                                
                                mediaPlayer.Source = Windows.Media.Core.MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/audio.mp3"));
                                mediaPlayer.AutoPlay = false;
                                mediaPlayer.Play();
                                playing = true;
                                
                                a = 1;
                            
                            catch (Exception)
                            

                            
                        

                        break;

                    // This means the user has denied access.
                    // Any further calls to RequestAccessAsync will instantly
                    // return Denied. The user must go to the Windows settings
                    // and manually allow access.
                    case Windows.UI.Notifications.Management.UserNotificationListenerAccessStatus.Denied:

                        // Show UI explaining that listener features will not
                        // work until user allows access.
                        break;

                    // This means the user closed the prompt without
                    // selecting either allow or deny. Further calls to
                    // RequestAccessAsync will show the dialog again.
                    case Windows.UI.Notifications.Management.UserNotificationListenerAccessStatus.Unspecified:

                        // Show UI that allows the user to bring up the prompt again
                        break;
                


            
            
        

【问题讨论】:

我尝试了您的代码,但结果表明该代码运行良好。我在输出窗口中打印b 的值,每次单击操作中心的通知时,我都可以看到该值正在发生变化。什么行为让你觉得生成的列表总是一样的? 这很奇怪,对我来说,b 的值总是为零。我需要执行任何其他步骤吗?当我说其他步骤时,我的意思是我只是安装了 Visual Studio 2019,选择了 UWP 模板并输入了此代码。我还需要做些什么才能让代码检测到通知吗? 您的测试设备的操作中心是否还有其他通知?当操作中心有通知时,它不应该总是返回零。 所以代码在不同的机器上工作。似乎问题出在测试设备本身,因为它在两天前崩溃并且不得不在其上重新安装 Windows。现在代码似乎可以工作了。 【参考方案1】:

更新上述内容。 该代码似乎在不同的设备中正常工作。编写此代码的测试机器最终崩溃,必须重新安装 Windows,之后相同的代码现在可以工作。所以看起来安装本身而不是代码有问题。

【讨论】:

以上是关于如何使用 UWP 应用检测由另一个应用触发的 Windows 10 Toast 通知的主要内容,如果未能解决你的问题,请参考以下文章

使用 UWP 监控实时音频并检测枪声/拍手声

如何等待在 UWP 应用中触发 EventHandler?

如何检测其他应用程序的音频是不是在后台播放? (UWP,Windows 10)

如何在 UWP 应用程序中检测拔出的耳机插孔?

如何检测 xamarin UWP 应用程序中标签元素的文本值更改?

如何在 UWP XAML 上将样式触发器设置为路径绑定父状态