Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Активация протокола (также называемая deep linking или активацией URI) позволяет другому приложению, браузеру или командной строке запустить ваше приложение через переход по URI, например myapp://action?param=value.
В этой статье показан код специально для приложения WPF. Полные инструкции см. в основной статье по обработке активации URI. Для получения полных сведений о богатой активации с помощью Windows App SDK, см. Богатая активация с помощью API жизненного цикла приложения.
Регистрация для активации протокола
Для обработки активации протокола необходимо зарегистрировать приложение. Для непакетированного приложения вы регистрируете его в коде. Для упакованного приложения вы регистрируете данные в манифесте приложения.
Неупакованные приложения
Для непакованного приложения .NET (настройка WPF/WinForms по умолчанию) зарегистрируйте протокол при запуске с помощью ActivationRegistrationManager. Регистрация выполняется для каждого пользователя и сохраняется, поэтому ее можно вызвать при каждом запуске.
В App.xaml.cs, переопределите 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);
}
Чтобы очистить регистрацию (например, на шаге удаления), вызовите ActivationRegistrationManager.UnregisterForProtocolActivation("myapp", "").
Упакованное приложение
Для упаковаемого приложения .NET объявите протокол в Package.appxmanifest в элементе <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>
Убедитесь, что пространство имен uap XML объявлено в элементе Package: xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10".
Управление активацией
Получение аргументов активации с помощью AppInstance.GetCurrent(). GetActivatedEventArgs. В следующем примере содержится код для распаковки приложения WPF, которое вызывает RegisterForProtocolActivation при запуске. Упакованные приложения активируются через регистрацию манифеста, благодаря чему они могут не вызывать 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.
}
Замечание
WPF и приложения Windows Forms должны вызвать AppInstance.GetCurrent().GetActivatedEventArgs() для получения данных активации URI. В отличие от приложений C++ Win32, .NET приложения не получают аргументы активации с помощью параметра точки входа запуска.
Обработка перенаправления одного экземпляра
Если приложение должно запускать только один экземпляр за раз, используйте AppInstance.FindOrRegisterForKey для перенаправления последующих запусков URI на запущенный экземпляр:
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();
});
}
Дополнительные сведения о развертывании приложений см. в разделе "Подключение приложений" с помощью API жизненного цикла приложения.
Связанный контент
Windows developer