Aplicativos de várias instâncias com SDK do Aplicativo Windows

Por padrão, um aplicativo da área de trabalho SDK do Aplicativo Windows pode executar várias instâncias simultaneamente. Cada instância é executada como um processo separado. Você pode controlar esse comportamento usando o Microsoft.Windows. Classe AppLifecycle.AppInstance para registrar instâncias, detectar as existentes e redirecionar ativações.

Cenários para gerenciamento de várias instâncias

  • Garantia de instância única — Redirecione novas ativações para a instância já em execução.
  • Roteamento baseado em chave – rotear arquivos ou URIs diferentes para instâncias específicas (por exemplo, uma instância por documento).
  • Descoberta de instância – enumerar todas as instâncias em execução para coordenar o trabalho.

Registrar uma instância com uma chave

Use AppInstance.FindOrRegisterForKey no método Main do seu aplicativo para reivindicar uma chave. Se a chave já estiver registrada por outra instância, você poderá redirecionar a ativação. O método personalizado Main a seguir fica em Program.cs, antes de qualquer inicialização de XAML:

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

Para usar um método personalizado Main , desabilite o ponto de entrada gerado automaticamente. No seu .csproj, defina <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> para anexar o símbolo sem sobrescrever as definições existentes.

Forçar comportamento de instância única

Para tornar seu aplicativo de instância única, sempre use a mesma chave:

var instance = AppInstance.FindOrRegisterForKey("single-instance");

if (!instance.IsCurrent)
{
    await instance.RedirectActivationToAsync(
        AppInstance.GetCurrent().GetActivatedEventArgs());
    return;
}

Enumerar instâncias em execução

Use AppInstance.GetInstances() para descobrir todas as instâncias registradas:

var instances = AppInstance.GetInstances();
foreach (var inst in instances)
{
    System.Diagnostics.Debug.WriteLine(
        $"Key: {inst.Key}, ProcessId: {inst.ProcessId}");
}

Desregistrar uma instância

Quando sua instância é desligada, o registro é removido automaticamente. Você também pode cancelar o registro explicitamente:

AppInstance.GetCurrent().UnregisterKey();

Diferenças em relação à UWP com suporte a múltiplas instâncias

Característica UWP SDK de Aplicativos Windows
Namespace Windows.ApplicationModel.AppInstance Microsoft.Windows.AppLifecycle.AppInstance
Requisito de manifesto Atributo SupportsMultipleInstances Não é necessário para aplicativos da área de trabalho
Descoberta de instância AppInstance.GetInstances() AppInstance.GetInstances() (mesmo padrão)
Redirecionamento de ativação AppInstance.RedirectActivationTo() AppInstance.RedirectActivationToAsync() (assíncrono)
Ponto de entrada principal personalizado Obrigatório Obrigatório (mesma abordagem)