Как обнаружить всплывающее уведомление Windows 10, вызванное другим приложением, с помощью приложения UWP

#c# #windows #visual-studio #uwp #toast

Вопрос:

Поэтому я пытаюсь создать приложение UWP, которое должно определять, отображаются ли в данный момент какие-либо уведомления о тостах, а затем, когда это произойдет, воспроизводить аудиофайл. Я пытаюсь использовать метод GetNotificationsAsync для достижения этой цели, но проблема в том, что список, созданный этим методом, всегда один и тот же, независимо от того, отображается ли в данный момент уведомление о тосте или нет. Ниже приведен фрагмент кода внутри кнопки, который запустит процесс, нужно ли выполнить какой-то дополнительный шаг? Также приложению было предоставлено разрешение на уведомления в 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;
                }


            }
            
        }
 

Комментарии:

1. Я попробовал ваш код на своей стороне, но результат показывает, что код работает хорошо. Я печатаю значение b в окне вывода, и я мог видеть, что значение меняется каждый раз, когда я нажимаю уведомление из Центра действий. Какое поведение заставляет вас чувствовать, что сгенерированный список всегда один и тот же?

2. Это странно, для меня значение b всегда равно нулю. Есть ли какие-либо дополнительные шаги, которые мне нужно выполнить? Когда я говорю «дополнительные шаги», я имею в виду, что я просто установил Visual Studio 2019, выбрал шаблон UWP и набрал этот код. Есть ли что-нибудь еще, что я должен сделать, чтобы, возможно, код обнаружил уведомления?

3. Есть ли какие-либо другие уведомления в Центре действий на ваших тестовых устройствах? Он не всегда должен возвращать ноль при наличии уведомлений в Центре действий.

4. Так что, оказывается, код работал на другой машине. Похоже, проблема была в самом тестовом устройстве, так как оно разбилось два дня назад, и на нем пришлось переустановить Windows. Теперь код, похоже, работает.

Ответ №1:

Обновите информацию об этом выше. Код, по-видимому, работает правильно на другом устройстве. Тестовая машина, на которой был написан этот код, в конечном итоге вышла из строя, и Windows пришлось переустановить, после чего теперь работает тот же код. Так что, похоже, была какая-то проблема с самой установкой, а не с кодом.