Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’activation du protocole (également appelée liaison approfondie ou activation d’URI) permet à une autre application, à un navigateur ou à la ligne de commande de lancer votre application en accédant à un URI tel que myapp://action?param=value.
Cet article présente du code spécifiquement pour une application WPF. Pour obtenir des conseils complets, consultez l’article principal sur l’activation d’URI de handle . Pour plus d’informations sur l’activation complète avec le SDK d'application Windows, consultez Rich activation avec l’API de cycle de vie des applications.
S’inscrire à l’activation du protocole
Vous devez inscrire votre application pour gérer l’activation du protocole. Pour une application non empaquetée, vous vous inscrivez dans le code. Pour une application empaquetée, vous vous inscrivez dans le manifeste de l’application.
Application non packagée
Pour une application .NET non empaquetée (configuration par défaut WPF/WinForms), inscrivez votre protocole au démarrage à l’aide de ActivationRegistrationManager. Les enregistrements sont par utilisateur et persistent, il est donc sûr de les appeler à chaque lancement.
Dans App.xaml.cs, remplacer 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);
}
Pour nettoyer l’inscription (par exemple, lors d’une étape de désinstallation), appelez ActivationRegistrationManager.UnregisterForProtocolActivation("myapp", "").
Application empaquetée
Pour une application .NET empaquetée, déclarez le protocole dans Package.appxmanifest sous l’élément <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>
Vérifiez que l’espace uap de noms XML est déclaré sur l’élément Package : xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10".
Gérer l’activation
Récupérez les arguments d’activation à l’aide d’AppInstance.GetCurrent(). GetActivatedEventArgs. L’exemple suivant inclut du code pour une application WPF non empaquetée, qui appelle RegisterForProtocolActivation au démarrage. Les applications empaquetées reçoivent l'activation via l'inscription du manifeste, leur permettant d'ignorer l'appel 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
Les applications WPF et Windows Forms doivent appeler AppInstance.GetCurrent().GetActivatedEventArgs() pour récupérer les données d’activation d’URI. Contrairement aux applications Win32 C++, .NET applications ne reçoivent pas d'arguments d'activation par le biais d'un paramètre de point d'entrée de démarrage.
Gérer la redirection à instance unique
Si votre application ne doit exécuter qu’une seule instance à la fois, utilisez AppInstance.FindOrRegisterForKey cette option pour rediriger les lancements d’URI suivants vers l’instance en cours d’exécution :
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();
});
}
Pour plus d’informations sur l’instanciation d’application, consultez Instanciation d’application avec l’API de cycle de vie de l’application.
Contenu connexe
- Activation enrichie avec l’API de cycle de vie des applications
- Gérer l’activation de l’URI
- Gérer l’activation des fichiers
- programmes par défaut
- exemple de lancement par l'association UWP
Windows developer