Freigeben über


Schnellstart: Verwenden von App-Benachrichtigungen mit dem Windows App SDK

Eine Bildschirmaufnahme mit einer App-Benachrichtigung über der Taskleiste. Die Benachrichtigung ist eine Erinnerung für ein Ereignis. Der App-Name, der Ereignisname, die Ereigniszeit und der Ereignisspeicherort werden angezeigt. Eine Auswahleingabe zeigt den aktuell ausgewählten Wert

In dieser Schnellstartanleitung erstellen Sie eine WinUI-App, die lokale App-Benachrichtigungen über die Windows App SDK sendet und reagiert.

Vollständige Beispiel-Apps, die App-Benachrichtigungen implementieren, finden Sie im Repository Windows App SDK Beispiele für GitHub.

Important

App-Benachrichtigungen werden für Apps mit erhöhten Rechten (Administrator) nicht unterstützt.

Prerequisites

  • Installieren Visual Studio 2022 (v17.6+)
  • Schließen Sie C++-Workload für C++- oder .NET-Workloads für die C#-Entwicklung ein.
  • Stellen Sie sicher, dass die MSIX-Verpackungstools unter .NET Desktopentwicklung ausgewählt sind.
  • Stellen Sie sicher, dass Windows Anwendungsentwicklung ausgewählt ist.
  • Stellen Sie sicher, dass Windows Ui-Anwendungsentwicklung ausgewählt ist.

Weitere Informationen zum Verwalten von Workloads in Visual Studio finden Sie unter Modify Visual Studio Workloads, Komponenten und Sprachpakete. Weitere Informationen zu den ersten Schritten mit WinUI finden Sie unter "Erste Schritte mit WinUI". Informationen zum Hinzufügen des Windows App SDK zu einem vorhandenen Projekt finden Sie unter Use the Windows App SDK in an existing project.

Erstellen eines neuen WinUI-App-Projekts in Visual Studio

  1. Erstellen Sie in Visual Studio ein neues Projekt.
  2. Legen Sie im Dialogfeld " Neues Projekt erstellen " den Sprachfilter auf "C#" oder "C++" und den Plattformfilter auf "WinUI" fest, und wählen Sie dann die Projektvorlage "Leere App, Verpackt (WinUI 3 in Desktop)" aus.
  3. Nennen Sie das neue Projekt "AppNotificationsExample".

Senden einer lokalen App-Benachrichtigung

In diesem Abschnitt fügen Sie Ihrer App eine Schaltfläche hinzu, die beim Klicken eine lokale App-Benachrichtigung sendet. Die Benachrichtigung enthält Textinhalte und ein App-Logobild. Außerdem fügen Sie zwei schreibgeschützte Textfelder hinzu, in denen die Aktivierungsargumente angezeigt werden, wenn der Benutzer auf die Benachrichtigung klickt.

Fügen Sie zunächst ein Schaltflächen-Steuerelement und zwei TextBox-Steuerelemente zu Ihrem MainWindow.xamlSteuerelement hinzu:

<!-- MainWindow.xaml -->
<Button x:Name="SendNotificationButton" Content="Send App Notification" Click="SendNotificationButton_Click"/>

<TextBlock Text="Activation arguments:" FontWeight="SemiBold" Margin="0,12,0,0"/>
<TextBox x:Name="ActionTextBox" Header="action" IsReadOnly="True" PlaceholderText="(none)"/>
<TextBox x:Name="ExampleEventIdTextBox" Header="exampleEventId" IsReadOnly="True" PlaceholderText="(none)"/>

Die App-Benachrichtigungs-APIs befinden sich im Microsoft.Windows. AppNotifications und Microsoft.Windows. AppNotifications.Builder Namespaces. Fügen Sie dem Projekt die folgenden Verweise hinzu:

// MainWindow.xaml.cs
using Microsoft.Windows.AppNotifications;
using Microsoft.Windows.AppNotifications.Builder;

Fügen Sie nun den folgenden Code zu Ihrem Schaltflächenklickhandler hinzu. In diesem Beispiel wird AppNotificationBuilder verwendet, um Benachrichtigungsinhalte zu erstellen, einschließlich der Argumente, die an die App zurückgegeben werden, wenn der Benutzer auf die Benachrichtigung, ein App-Logo-Bild und Text klickt. Die Benachrichtigung enthält auch eine Schaltfläche, die das Ausführen einer Aktion veranschaulicht, ohne die Benutzeroberfläche der App zu starten. Die BuildNotification-Methode erstellt das AppNotification-Objekt , und AppNotificationManager.Show zeigt es dem Benutzer an.

// MainWindow.xaml.cs
private void SendNotificationButton_Click(object sender, RoutedEventArgs e)
{
    var appNotification = new AppNotificationBuilder()
        .AddArgument("action", "NotificationClick")
        .AddArgument("exampleEventId", "1234")
        .SetAppLogoOverride(new System.Uri("ms-appx:///Assets/Square150x150Logo.png"), AppNotificationImageCrop.Circle)
        .AddText("This is text content for an app notification.")
        .AddButton(new AppNotificationButton("Perform action without launching app")
            .AddArgument("action", "BackgroundAction"))
        .BuildNotification();

    AppNotificationManager.Default.Show(appNotification);
}

Zu diesem Zeitpunkt können Sie Ihre App erstellen und ausführen. Klicken Sie auf die Schaltfläche " App-Benachrichtigung senden ", um die Benachrichtigung anzuzeigen. Beachten Sie, dass das Klicken auf die Benachrichtigung noch keine Aktion ausführt. Im nächsten Abschnitt erfahren Sie, wie Sie die App-Aktivierung behandeln, damit Ihre App reagieren kann, wenn ein Benutzer auf die Benachrichtigung klickt.

Note

App-Benachrichtigungen werden nicht unterstützt, wenn Ihre App mit Administratorrechten (mit erhöhten Rechten) ausgeführt wird. Die Anzeige wird fehlschlagen, ohne dass ein Hinweis erfolgt, und es wird keine Benachrichtigung angezeigt. Stellen Sie beim Testen von Benachrichtigungen sicher, dass Sie Ihre App ohne Erhöhung ausführen.

Aktualisieren der App-Paketmanifestdatei

Die Package.appmanifest Datei enthält die Details des MSIX-Pakets für eine App. Damit Ihre App gestartet werden kann, wenn ein Benutzer mit einer App-Benachrichtigung interagiert, müssen Sie ihre App-Paketmanifestdatei so aktualisieren, dass Ihre App beim System als Ziel für die App-Benachrichtigungsaktivierung registriert wird. Weitere Informationen zu App-Paketmanifesten finden Sie unter App-Paketmanifest.

  1. Bearbeiten Sie die Datei Package.appxmanifest, indem Sie mit der rechten Maustaste auf die Datei in Projektmappen-Explorer klicken und View Code auswählen.
  2. Fügen Sie xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10" und xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" Namespaces zu <Package> hinzu.
  3. Fügen Sie ein <desktop:Extension> Element unter <Extensions>. Setzen Sie das Category-Attribut auf "windows.toastNotificationActivation", um anzugeben, dass Ihre App durch App-Benachrichtigungen aktiviert werden kann.
    • Fügen Sie ein <desktop:ToastNotificationActivation>-Unterelement hinzu und weisen Sie dem ToastActivatorCLSID eine GUID zu, die Ihre App eindeutig identifiziert.
    • Sie können eine GUID in Visual Studio generieren, indem Sie zu Tools > Create GUID wechseln.
  4. Fügen Sie ein <com:Extension> Element unter <Extensions> hinzu, und legen Sie das Category Attribut auf "windows.comServer". Die unten gezeigte Beispielmanifestdatei zeigt die Syntax für dieses Element.
    • Aktualisieren Sie das Executable Attribut des <com:ExeServer> Elements mit ihrem ausführbaren Namen. In diesem Beispiel lautet der Name "AppNotificationsExample.exe".
    • Geben Sie Arguments="----AppNotificationActivated:" an, damit das Windows App SDK die Nutzlast Ihrer Benachrichtigung als AppNotification-Typ verarbeiten kann.
    • Legen Sie das Id Attribut des <com:Class> Elements auf dieselbe GUID fest, die Sie für das ToastActivatorCLSID Attribut verwendet haben.
<!--package.appxmanifest-->

<Package
  xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
  xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  ...
  <Applications>
    <Application>
      ...
      <Extensions>

        <!--Specify which CLSID to activate when notification is clicked-->   
        <desktop:Extension Category="windows.toastNotificationActivation">
          <desktop:ToastNotificationActivation ToastActivatorCLSID="replaced-with-your-guid-C173E6ADF0C3" />
        </desktop:Extension>

        <!--Register COM CLSID-->    
        <com:Extension Category="windows.comServer">
          <com:ComServer>
            <com:ExeServer Executable="SampleApp.exe" DisplayName="SampleApp" Arguments="----AppNotificationActivated:">
              <com:Class Id="replaced-with-your-guid-C173E6ADF0C3" />
            </com:ExeServer>
          </com:ComServer>
        </com:Extension>
    
      </Extensions>
    </Application>
  </Applications>
 </Package>

Aktivierung durch eine App-Benachrichtigung handhaben

Wenn ein Benutzer auf eine App-Benachrichtigung oder eine Schaltfläche in einer Benachrichtigung klickt, muss Ihre App entsprechend reagieren. Es gibt zwei häufige Aktivierungsszenarien:

  1. Mit Benutzeroberfläche starten — Der Benutzer klickt auf den Benachrichtigungskörper, und Ihre App sollte starten oder in den Vordergrund kommen und relevante Inhalte anzeigen.
  2. Hintergrundaktion – Der Benutzer klickt auf eine Schaltfläche in der Benachrichtigung, die eine Aktion auslöst (z. B. das Senden einer Antwort), ohne eine App-UI anzuzeigen.

Um beide Szenarien zu unterstützen, sollte der Aktivierungsfluss Ihrer App das Hauptfenster OnLaunched erstellen, aber nicht sofort aktivieren. Registrieren Sie stattdessen das Ereignis "AppNotificationManager.NotificationInvoked ", rufen Sie "AppNotificationManager.Register" auf, und überprüfen Sie dann "AppInstance.GetActivatedEventArgs ", um festzustellen, ob die App über eine Benachrichtigung oder über einen normalen Start gestartet wurde. Wenn der Start durch eine Benachrichtigung ausgelöst wurde, kann Ihr Code die Benachrichtigungsargumente überprüfen und entscheiden, ob das Fenster angezeigt oder die Aktion im Hintergrund behandelt und beendet werden soll.

Das NotificationInvoked Ereignis behandelt Klicks, die auftreten, während die App bereits ausgeführt wird. Wenn die App nicht ausgeführt wird, startet Windows die App über die COM-Aktivierung und die Aktivierungsart wird als Launch gemeldet, nicht als AppNotification. Die Benachrichtigungsargumente werden dann über das NotificationInvoked Ereignis übermittelt.

Important

Sie müssen "AppNotificationManager.Register " aufrufen, bevor Sie "AppInstance.GetActivatedEventArgs" aufrufen.

Important

Das Setzen der Einstellung activationType="background" in der XML-Nutzlast der Benachrichtigung wird für Desktop-Anwendungen ignoriert. Sie müssen die Aktivierungsargumente im Code verarbeiten und entscheiden, ob ein Fenster angezeigt werden soll.

// App.xaml.cs
using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle;
using Microsoft.Windows.AppNotifications;

namespace AppNotificationsExample;

public partial class App : Application
{
    private Window? _window;

    public App()
    {
        InitializeComponent();
    }

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        _window = new MainWindow();

        AppNotificationManager.Default.NotificationInvoked += OnNotificationInvoked;
        AppNotificationManager.Default.Register();

        var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();

        if (activatedArgs.Kind == ExtendedActivationKind.AppNotification)
        {
            // App was launched by clicking a notification
            var notificationArgs = (AppNotificationActivatedEventArgs)activatedArgs.Data;
            HandleNotification(notificationArgs);
        }
        else
        {
            // Normal launch
            _window.Activate();
        }
    }

    private void OnNotificationInvoked(AppNotificationManager sender, AppNotificationActivatedEventArgs args)
    {
        // Notification clicked while app is already running
        HandleNotification(args);
    }

    private void HandleNotification(AppNotificationActivatedEventArgs args)
    {
        var action = args.Arguments.ContainsKey("action") ? args.Arguments["action"] : "(none)";
        var exampleEventId = args.Arguments.ContainsKey("exampleEventId") ? args.Arguments["exampleEventId"] : "(none)";

        _window!.DispatcherQueue.TryEnqueue(() =>
        {
            switch (action)
            {
                case "BackgroundAction":
                    // Handle the action without showing the app window.
                    // If the window was never shown, exit the app.
                    if (!_window.Visible)
                    {
                        Application.Current.Exit();
                    }
                    break;

                default:
                    // Bring the app to the foreground and display the notification arguments.
                    _window.Activate();
                    ((MainWindow)_window).UpdateNotificationUI(action, exampleEventId);
                    break;
            }
        });
    }
}

Fügen Sie eine UpdateNotificationUI Methode zu MainWindow hinzu, um die Benachrichtigungsargumente in den zuvor hinzugefügten Textfeldern anzuzeigen.

// MainWindow.xaml.cs
public void UpdateNotificationUI(string action, string exampleEventId)
{
    DispatcherQueue.TryEnqueue(() =>
    {
        ActionTextBox.Text = action;
        ExampleEventIdTextBox.Text = exampleEventId;
    });
}

Nächste Schritte

Siehe auch