Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aktywacja protokołu (nazywana również aktywacją głębokiego łączenia lub aktywacji identyfikatora URI) umożliwia innej aplikacji, przeglądarce lub wierszu polecenia uruchomienie aplikacji przez przejście do identyfikatora URI, takiego jak myapp://action?param=value.
W tym artykule przedstawiono kod przeznaczony specjalnie dla aplikacji WPF. Aby uzyskać pełne wskazówki, zobacz główny artykuł dotyczący obsługi aktywacji URI. Aby uzyskać szczegółowe informacje na temat Rich activation za pomocą Zestaw SDK do aplikacji systemu Windows, zobacz Rich activation za pomocą interfejsu API cyklu życia aplikacji.
Rejestrowanie na potrzeby aktywacji protokołu
Aby obsługiwać aktywację protokołu, musisz zarejestrować aplikację. W przypadku niezapakowanej aplikacji należy zarejestrować się w kodzie. W przypadku spakowanej aplikacji należy zarejestrować się w manifeście aplikacji.
Rozpakowana aplikacja
W przypadku niezapakowanej aplikacji .NET (domyślnej konfiguracji WPF/WinForms) zarejestruj protokół podczas uruchamiania przy użyciu ActivationRegistrationManager. Rejestracje są na użytkownika i utrwalane, więc można bezpiecznie wywołać je na każdym uruchomieniu.
W App.xaml.cs pliku zastąp OnStartuppolecenie:
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);
}
Aby wyczyścić rejestrację (na przykład w kroku odinstalowania), wywołaj metodę ActivationRegistrationManager.UnregisterForProtocolActivation("myapp", "").
Spakowana aplikacja
W przypadku spakowanej aplikacji .NET zadeklaruj protokół w 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>
Upewnij się, że uap przestrzeń nazw XML jest zadeklarowana w elemecie Package : xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10".
Zarządzanie aktywacją
Pobierz argumenty aktywacji przy użyciu klasy AppInstance.GetCurrent(). GetActivatedEventArgs. Poniższy przykład zawiera kod dla rozpakowanej aplikacji WPF, która wywołuje RegisterForProtocolActivation podczas uruchamiania. Pakietowe aplikacje otrzymują aktywację poprzez rejestrację manifestu, dzięki czemu mogą pominąć wywołanie 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.
}
Uwaga / Notatka
aplikacje WPF i Windows Forms muszą wywołać AppInstance.GetCurrent().GetActivatedEventArgs() w celu pobrania danych aktywacji identyfikatora URI. W przeciwieństwie do aplikacji Win32 języka C++, .NET aplikacje nie otrzymują argumentów aktywacji za pośrednictwem parametru punktu wejścia uruchamiania.
Obsługa przekierowania pojedynczej instancji
Jeśli aplikacja powinna uruchamiać tylko jedno wystąpienie naraz, użyj AppInstance.FindOrRegisterForKey , aby przekierować kolejne próby uruchomienia URI do działającego wystąpienia.
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();
});
}
Aby uzyskać więcej informacji na temat instancjonowania aplikacji, zobacz Instancjonowanie aplikacji przy użyciu interfejsu API cyklu życia aplikacji.