Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Aktivace protokolu (označovaná také jako aktivace pomocí hloubkového propojení nebo aktivace identifikátoru URI) umožňuje spuštění jiné aplikace, prohlížeče nebo příkazového řádku tak, že přejdete na identifikátor URI, například myapp://action?param=value.
Tento článek ukazuje kód speciálně pro WPF (Windows Presentation Foundation) aplikaci. Pro kompletní pokyny si přečtěte hlavní článek: Aktivace URI zpracování. Úplné podrobnosti o bohaté aktivaci pomocí Windows App SDK najdete v části Bohatá aktivace pomocí API životního cyklu aplikace.
Registrace k aktivaci protokolu
Abyste mohli zpracovávat aktivaci protokolu, musíte aplikaci zaregistrovat. Pro rozbalenou aplikaci se zaregistrujete v kódu. Pro zabalenou aplikaci se zaregistrujete v manifestu aplikace.
Rozbalené aplikace
Pro rozbalenou aplikaci .NET (výchozí nastavení WPF (Windows Presentation Foundation)/WinForms) zaregistrujte protokol při spuštění pomocí ActivationRegistrationManager. Registrace jsou pro jednotlivé uživatele a trvalé, takže je bezpečné je volat při každém spuštění.
Ve App.xaml.cs, přepsat 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);
}
Pokud chcete vyčistit registraci (například v kroku odinstalace), zavolejte ActivationRegistrationManager.UnregisterForProtocolActivation("myapp", "").
Zabalená aplikace
Pro zabalenou aplikaci .NET deklarujte protokol v Package.appxmanifest pod elementem <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>
Ujistěte se, že na elementu Package je deklarován obor názvů XML uap: xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10".
Řešení aktivace
Načtěte aktivační argumenty pomocí AppInstance.GetCurrent(). GetActivatedEventArgs. Následující příklad obsahuje kód pro rozbalenou aplikaci WPF (Windows Presentation Foundation), která při spuštění volá RegisterForProtocolActivation. Zabalené aplikace obdrží aktivaci prostřednictvím registrace manifestu RegisterForProtocolActivation , aby mohly volání přeskočit.
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.
}
Poznámka:
WPF (Windows Presentation Foundation) a model Windows Forms aplikace musí volat AppInstance.GetCurrent().GetActivatedEventArgs() pro načtení aktivačních dat identifikátoru URI. Na rozdíl od aplikací Win32 c++ aplikace .NET nedostávají aktivační argumenty prostřednictvím parametru vstupního bodu po spuštění.
Zpracování přesměrování jedné instance
Pokud by vaše aplikace měla běžet pouze jedna instance najednou, použijte AppInstance.FindOrRegisterForKey k přesměrování následných spuštění URI do běžící instance.
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();
});
}
Další informace o vytváření instancí aplikací najdete v tématu Vytváření instancí aplikací pomocí rozhraní API životního cyklu aplikace.
Související obsah
Windows developer