Hantera aktivering av URI-protokoll i en .NET-app

Protokollaktivering (kallas även djuplänkning eller URI-aktivering) låter en annan app, en webbläsare eller kommandoraden starta din app genom att navigera till en URI som myapp://action?param=value.

Den här artikeln visar kod specifikt för en WPF app. Fullständig vägledning finns i huvudartikeln hantera URI-aktivering . Fullständig information om omfattande aktivering med Windows App SDK finns i Rich-aktivering med appens livscykel-API.

Registrera dig för protokollaktivering

Du måste registrera din app för att hantera protokollaktivering. För en opackad app registrerar du appen i koden. För en paketerad app registrerar du dig i appmanifestet.

Oförpackad app

För en uppackad .NET app (standardinställningen WPF/WinForms) registrerar du protokollet vid start med hjälp av ActivationRegistrationManager. Registreringar är per användare och bevaras, så det är säkert att anropa detta vid varje start.

I App.xaml.csåsidosätter du OnStartup:

using Microsoft.Windows.AppLifecycle;

protected override void OnStartup(StartupEventArgs e)
{
    // Register the URI scheme "myapp://" for this app.
    // For the logo, pass the exe path + resource index (or "" to use the default icon).
    string exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName ?? "";
    string logo = string.IsNullOrEmpty(exePath) ? "" : exePath + ",0";
    ActivationRegistrationManager.RegisterForProtocolActivation(
        "myapp",                // URI scheme (no "://")
        logo,                   // logo: exe path + resource index, or "" for default icon
        "My App",               // display name for the protocol
        exePath);               // path of this EXE; pass "" to default to the current process

    base.OnStartup(e);
}

Om du vill rensa registreringen (till exempel i ett avinstallationssteg) anropar du ActivationRegistrationManager.UnregisterForProtocolActivation("myapp", "").

Paketerad app

För en paketerad .NET app deklarerar du protokollet i Package.appxmanifest under elementet <Applications><Application>:

<Applications>
  <Application ...>
    <Extensions>
      <uap:Extension Category="windows.protocol">
        <uap:Protocol Name="myapp">
          <uap:DisplayName>My App</uap:DisplayName>
        </uap:Protocol>
      </uap:Extension>
    </Extensions>
  </Application>
</Applications>

Kontrollera att uap XML-namnområdet har deklarerats för elementet Package : xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10".

Hantera aktiveringen

Hämta aktiveringsargumenten med AppInstance.GetCurrent(). GetActivatedEventArgs. I följande exempel ingår kod för en uppackad WPF app, som anropar RegisterForProtocolActivation vid start. Paketerade appar får aktivering via manifestregistreringen, så att de kan hoppa över anropet RegisterForProtocolActivation .

using Microsoft.Windows.AppLifecycle;
using Windows.ApplicationModel.Activation;

protected override void OnStartup(StartupEventArgs e)
{
    // Unpackaged apps only: register the protocol at startup.
    // Packaged apps (MSIX): skip these lines — the manifest handles registration.
    string exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName ?? "";
    string logo = string.IsNullOrEmpty(exePath) ? "" : exePath + ",0";
    ActivationRegistrationManager.RegisterForProtocolActivation(
        "myapp", logo, "My App", exePath);

    // Get the activation args for this specific launch.
    AppActivationArguments args = AppInstance.GetCurrent().GetActivatedEventArgs();
    if (args?.Kind == ExtendedActivationKind.Protocol)
    {
        var protocolArgs = (ProtocolActivatedEventArgs)args.Data;
        HandleProtocolActivation(protocolArgs.Uri);
    }

    base.OnStartup(e);
}

private void HandleProtocolActivation(Uri uri)
{
    // Navigate to or open content based on uri.AbsolutePath or uri.Query.
}

Note

WPF- och Windows Forms-applikationer måste anropa AppInstance.GetCurrent().GetActivatedEventArgs() för att hämta URI-aktiveringsdata. Till skillnad från C++ Win32-appar tar .NET appar inte emot aktiveringsargument via en startparameter.

Hantera omdirigering för enstaka instans

Om din app bara ska köra en instans i taget använder du AppInstance.FindOrRegisterForKey för att omdirigera efterföljande URI-uppskjutningar till den instans som körs:

protected override void OnStartup(StartupEventArgs e)
{
    string exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName ?? "";
    string logo = string.IsNullOrEmpty(exePath) ? "" : exePath + ",0";
    ActivationRegistrationManager.RegisterForProtocolActivation(
        "myapp", logo, "My App", exePath);

    // Try to claim the "main" key. If another instance already has it, redirect and exit.
    AppInstance currentInstance = AppInstance.FindOrRegisterForKey("main");
    if (!currentInstance.IsCurrent)
    {
        var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
        // Run the async redirect on a thread-pool thread to avoid a potential deadlock
        // with the WPF SynchronizationContext. Signal completion via an event so that
        // this code path exits cleanly without re-entering the STA message pump.
        var redirectCompleted = new System.Threading.ManualResetEventSlim(false);
        System.Threading.Tasks.Task.Run(async () =>
        {
            await currentInstance.RedirectActivationToAsync(activationArgs);
            redirectCompleted.Set();
        });
        redirectCompleted.Wait();
        Shutdown();
        return;
    }

    // This is the first instance. Subscribe to future activations.
    currentInstance.Activated += OnActivated;
    base.OnStartup(e);
}

private void OnActivated(object sender, AppActivationArguments args)
{
    Dispatcher.Invoke(() =>
    {
        if (args.Kind == ExtendedActivationKind.Protocol)
        {
            var protocolArgs = (ProtocolActivatedEventArgs)args.Data;
            HandleProtocolActivation(protocolArgs.Uri);
        }
        MainWindow?.Activate();
    });
}

För mer information om appinstansering, se Appinstansering med appens livscykel-API.