Ativação de aplicações para aplicações desktop do SDK de Aplicações Windows

Quando o sistema ou outra aplicação inicia a sua aplicação, ativa-a . Dependendo de como a aplicação é iniciada, o tipo de ativação varia. Este artigo explica como lidar com diferentes cenários de ativação numa aplicação desktop do SDK de Aplicações Windows.

Visão geral da ativação

O SDK de Aplicações Windows oferece um modelo de ativação avançado através do espaço de nomes Microsoft.Windows.AppLifecycle. Usas o AppInstance.GetActivatedEventArgs para recuperar detalhes de ativação a qualquer momento.

Os tipos de ativação mais comuns incluem:

Tipo de ativação Scenario
Launch O utilizador seleciona o mosaico ou o atalho da aplicação
File O utilizador abre um ficheiro associado à aplicação
Protocol É invocado um esquema URI registado na aplicação
StartupTask A aplicação está configurada para iniciar no login do utilizador
PushNotification A aplicação é ativada por um AppNotification (via AppNotificationManager)

Importante

As aplicações de ambiente de trabalho do SDK de Aplicações Windows utilizam APIs Microsoft.Windows.AppLifecycle para ativação avançada. O Microsoft.UI.Xaml.Application.OnLaunched método ainda é chamado para aplicações baseadas em XAML, mas não fornece todos os tipos de ativação. Consulte AppInstance.GetActivatedEventArgs() para obter o contexto completo da ativação.

Gerir a ativação do arranque

O tipo de ativação mais comum é um início padrão. Substituir OnLaunched no seu App.xaml.cs:

using Microsoft.UI.Xaml;

public partial class App : Application
{
    private Window? m_window;

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        m_window = new MainWindow();
        m_window.Activate();
    }
}

// MainWindow is the window class generated by the WinUI 3 project
// template (MainWindow.xaml / MainWindow.xaml.cs).
public partial class MainWindow : Window
{
}

Processar tipos de ativação avançados

Para responder a ativações por ficheiro, protocolo ou outros tipos, verifique AppInstance.GetActivatedEventArgs() durante o arranque da sua aplicação. Uma abordagem típica consiste em verificar em OnLaunched ou no método Main:

using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle;

public partial class App : Application
{
    private Window? m_window;

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();

        m_window = new MainWindow();

        switch (activatedArgs.Kind)
        {
            case ExtendedActivationKind.File:
                var fileArgs = activatedArgs.Data as
                    Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
                if (fileArgs != null)
                {
                    // Navigate to a page that handles the file
                    // fileArgs.Files contains the list of activated files
                }
                break;

            case ExtendedActivationKind.Protocol:
                var protocolArgs = activatedArgs.Data as
                    Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs;
                if (protocolArgs != null)
                {
                    // Navigate based on the URI
                    // protocolArgs.Uri contains the activation URI
                }
                break;

            default:
                // Standard launch — navigate to home page
                break;
        }

        m_window.Activate();
    }
}

// MainWindow is the window class generated by the WinUI 3 project
// template (MainWindow.xaml / MainWindow.xaml.cs).
public partial class MainWindow : Window
{
}

Registar-se para tipos de ativação

A forma como se regista para ativação de ficheiros ou protocolos depende de a sua aplicação ser empacotada (MSIX) ou não empacotada.

Aplicações empacotadas

Registe as associações no manifesto da sua aplicação:

Associação de tipos de ficheiro (em Package.appxmanifest):

<Extensions>
  <uap:Extension Category="windows.fileTypeAssociation">
    <uap:FileTypeAssociation Name="myfiletype">
      <uap:SupportedFileTypes>
        <uap:FileType>.myext</uap:FileType>
      </uap:SupportedFileTypes>
    </uap:FileTypeAssociation>
  </uap:Extension>
</Extensions>

Associação de protocolo:

<Extensions>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="myapp" />
  </uap:Extension>
</Extensions>

Para ativação no arranque, consulte Configurar a sua aplicação para iniciar no início de sessão.

Aplicações não empacotadas

Aplicações não empacotadas (por exemplo, uma aplicação WPF ou Win32 simples usando o SDK de Aplicações Windows) não têm manifesto, por isso regista os mesmos tipos de ativação no código no arranque usando os métodos estáticos em Microsoft.Windows.AppLifecycle.ActivationRegistrationManager. Os registos são por utilizador e mantêm-se durante os lançamentos, por isso é seguro anunciar isto sempre que a sua aplicação inicia.

using Microsoft.Windows.AppLifecycle;

// Register a protocol (URI scheme)
ActivationRegistrationManager.RegisterForProtocolActivation(
    "myapp",            // scheme
    string.Empty,       // logo (optional)
    "My App",           // display name
    string.Empty);      // exePath — empty registers the current executable

// Register a file type
ActivationRegistrationManager.RegisterForFileTypeActivation(
    new[] { ".myext" },                 // supported file extensions
    string.Empty,                       // logo (optional)
    "My App",                           // display name
    new[] { "open" },                   // supported verbs
    string.Empty);                      // exePath — empty registers the current executable

Para remover um registo (por exemplo, durante a desinstalação), chame o método correspondente UnregisterForProtocolActivation ou UnregisterForFileTypeActivation.

Tanto as aplicações embaladas como as não embaladas recuperam os argumentos de ativação da mesma forma, usando AppInstance.GetCurrent().GetActivatedEventArgs(), como mostrado anteriormente neste artigo. Para mais detalhes, consulte Ativação enriquecida com a API do ciclo de vida da aplicação.

Ativação do controlo numa instância em execução

Se a sua aplicação já estiver a correr quando ocorre uma segunda ativação, pode redirecioná-la para a instância existente usando as APIs multi-instância. Consulte aplicações de várias instâncias para obter detalhes sobre como registar chaves e redirecionar ativações.

Diferenças em relação à ativação do UWP

Feature UWP SDK de Aplicações Windows (Desktop)
Ponto de ativação OnActivated, OnFileActivated, OnLaunched substituições AppInstance.GetActivatedEventArgs() + OnLaunched
Estado de execução anterior LaunchActivatedEventArgs.PreviousExecutionState Não fornecido pelo sistema — implemente o seu próprio
Suporte pré-lançamento Sim (opt-in) No
Namespace Windows.ApplicationModel.Activation Microsoft.Windows.AppLifecycle (com Windows.ApplicationModel.Activation tipos de dados)