Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
Relaterat innehåll
Windows developer