Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Alapértelmezés szerint egy Windows App SDK asztali alkalmazás egyszerre több példányt is futtathat. Minden példány külön folyamatként fut. Ezt a viselkedést a Microsoft.Windows használatával szabályozhatja. Az AppLifecycle.AppInstance osztály a példányok regisztrálására, a meglévők észlelésére és az aktiválások átirányítására használható.
Forgatókönyvek többpéldányos felügyelethez
- Egypéldányos kényszerítés – Új aktiválások átirányítása a már futó példányra.
- Kulcsalapú útválasztás – Különböző fájlok vagy URI-k átirányítása adott példányokhoz (például dokumentumonként egy példány).
- Példányfelderítés – Az összes futó példány számbavétele a munka koordinálásához.
Példány regisztrálása kulccsal
Használja a(z) AppInstance.FindOrRegisterForKey elemet az alkalmazás Main metódusában egy kulcs igényléséhez. Ha a kulcsot már regisztrálta egy másik példány, átirányíthatja az aktiválást. Az alábbi egyéni Main metódus a(z) Program.cs elembe kerül, még az XAML inicializálása előtt:
using Microsoft.Windows.AppLifecycle;
public static class Program
{
[STAThread]
static async Task Main(string[] args)
{
// Required before calling any other Windows App SDK or WinRT API
// from a custom entry point.
WinRT.ComWrappersSupport.InitializeComWrappers();
// Determine a key for this activation
string instanceKey = "main-instance";
var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
if (activatedArgs.Kind == ExtendedActivationKind.File)
{
var fileArgs = activatedArgs.Data as
Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
// Use the file path as the instance key to route
// each file to its own instance
if (fileArgs?.Files is { Count: > 0 })
{
instanceKey = fileArgs.Files[0].Path;
}
}
var instance = AppInstance.FindOrRegisterForKey(instanceKey);
if (!instance.IsCurrent)
{
// Another instance owns this key — redirect activation to it
await instance.RedirectActivationToAsync(activatedArgs);
return; // Exit this process
}
// This instance owns the key — proceed with normal startup
// Register for future redirected activations
instance.Activated += OnActivated;
Application.Start((p) =>
{
var context = new DispatcherQueueSynchronizationContext(
DispatcherQueue.GetForCurrentThread());
SynchronizationContext.SetSynchronizationContext(context);
_ = new App();
});
}
private static void OnActivated(object? sender, AppActivationArguments args)
{
// Handle the redirected activation on the UI thread
// For example, open the file or navigate to the URI
}
// App is the application type generated by the WinUI 3 project template
// (App.xaml / App.xaml.cs).
private partial class App : Microsoft.UI.Xaml.Application
{
}
}
Note
Egyéni Main metódus használatához tiltsa le az automatikusan létrehozott belépési pontot. A(z) .csproj elemben állítsa be a(z) <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> értékét úgy, hogy a szimbólumot a meglévő definíciók felülírása nélkül fűzze hozzá.
Egypéldányos viselkedés kényszerítése
Az alkalmazás egypéldányossá alakításához mindig ugyanazt a kulcsot használja:
var instance = AppInstance.FindOrRegisterForKey("single-instance");
if (!instance.IsCurrent)
{
await instance.RedirectActivationToAsync(
AppInstance.GetCurrent().GetActivatedEventArgs());
return;
}
Futó példányok számbavétele
A(z) AppInstance.GetInstances() használatával felderítheti az összes regisztrált példányt:
var instances = AppInstance.GetInstances();
foreach (var inst in instances)
{
System.Diagnostics.Debug.WriteLine(
$"Key: {inst.Key}, ProcessId: {inst.ProcessId}");
}
Példány regisztrációjának megszüntetése
Amikor a példány leáll, a rendszer automatikusan eltávolítja a regisztrációt. A regisztrációt explicit módon is megszüntetheti:
AppInstance.GetCurrent().UnregisterKey();
Különbségek a többpéldányos UWP-től
| Funkció | UWP | Windows App SDK |
|---|---|---|
| Namespace | Windows.ApplicationModel.AppInstance |
Microsoft.Windows.AppLifecycle.AppInstance |
| Manifesztumkövetelmény |
SupportsMultipleInstances attribútum |
Asztali alkalmazásokhoz nem szükséges |
| Példányfelderítés | AppInstance.GetInstances() |
AppInstance.GetInstances() (ugyanaz a minta) |
| Aktiválás átirányítása | AppInstance.RedirectActivationTo() |
AppInstance.RedirectActivationToAsync() (async) |
| Egyéni fő indítási pont | Required | Kötelező (ugyanaz a megközelítés) |
Kapcsolódó tartalom
Windows developer