Partilhar via


IDs de modelo de usuário de aplicativo (AppUserModelIDs)

As IDs de modelo de usuário de aplicativo (AppUserModelIDs) são usadas extensivamente pela barra de tarefas no Windows 7 e sistemas posteriores para associar processos, arquivos e janelas a um aplicativo específico. Em alguns casos, é suficiente confiar no AppUserModelID interno atribuído a um processo pelo sistema. No entanto, um aplicativo que possui vários processos ou um aplicativo que está sendo executado em um processo de host pode precisar se identificar explicitamente para que ele possa agrupar suas janelas de outra forma díspares em um único botão da barra de tarefas e controlar o conteúdo da Lista de Atalhos desse aplicativo.

Application-Defined e System-Defined AppUserModelIDs

Alguns aplicativos não declaram um AppUserModelID explícito. São opcionais. Nesse caso, o sistema usa uma série de heurísticas para atribuir um AppUserModelID interno. No entanto, há um benefício de desempenho em evitar esses cálculos e um AppUserModelID explícito é a única maneira de garantir uma experiência exata do usuário. Portanto, é altamente recomendável que um ID explícito seja definido. Os aplicativos não podem recuperar um AppUserModelID atribuído pelo sistema.

Se um aplicativo usa um AppUserModelID explícito, ele também deve atribuir o mesmo AppUserModelID a todas as janelas ou processos, atalhos e associações de arquivo em execução. Ele também deve usar esse AppUserModelID ao personalizar sua Lista de Atalhos por meio ICustomDestinationList e em todas as chamadas para SHAddToRecentDocs.

Observação

Se os aplicativos não tiverem um AppUserModelID explícito, eles deverão chamar IApplicationDestinations, IApplicationDocumentListse métodos de ICustomDestinationList, bem como SHAddToRecentDocs de dentro do aplicativo. Se esses métodos forem chamados de outro processo, como um instalador ou desinstalador, o sistema não poderá gerar o AppUserModelID correto e essas chamadas não terão efeito.

 

Os itens a seguir descrevem cenários comuns que exigem um AppUserModelID explícito. Eles também apontam casos em que vários AppUserModelIDs explícitos devem ser usados.

  • Um único arquivo executável com uma interface do usuário com vários modos que aparecem para o usuário como aplicativos separados deve atribuir AppUserModelIDs diferentes para cada modo. Por exemplo, uma parte de um aplicativo que os usuários veem como uma experiência independente na qual eles podem fixar e iniciar a partir da barra de tarefas separadamente do resto do aplicativo deve ter seu próprio AppUserModelID, separado da experiência principal.

  • Vários atalhos com argumentos diferentes que levam ao que o usuário vê como o mesmo aplicativo devem usar um AppUserModelID para todos os atalhos. Por exemplo, o Windows Internet Explorer tem atalhos diferentes para diferentes modos (como iniciar sem complementos), mas todos eles devem aparecer para o usuário como uma única instância do Internet Explorer.

  • Um executável que atua como um processo de host e executa o conteúdo de destino como um aplicativo deve se registrar como um aplicativo host, após o qual ele pode atribuir diferentes AppUserModelIDs a cada experiência percebida que hospeda. Como alternativa, o processo de host pode permitir que o programa hospedado defina seus AppUserModelIDs. Em ambos os casos, o processo de host deve manter um registro da origem dos AppUserModelIDs, seja ele próprio ou o aplicativo hospedado. Nesse caso, não há experiência de usuário principal do processo de host sem o conteúdo de destino. Exemplos são aplicativos Windows Remote Applications Integrated Locally (RAIL), Java Runtime, RunDLL32.exeou DLLHost.exe.

    No caso de aplicativos hospedados existentes, o sistema tenta identificar experiências individuais, mas novos aplicativos devem usar AppUserModelIDs explícitos para garantir a experiência do usuário pretendida.

  • Processos cooperativos ou encadeados que para o usuário fazem parte do mesmo aplicativo devem ter o mesmo AppUserModelID aplicado a cada processo. Exemplos incluem jogos com um processo de lançamento (encadeado) e o Microsoft Windows Media Player, que tem uma experiência de primeira execução/configuração em execução em um processo e o aplicativo principal em execução em outro processo (cooperativo).

  • Uma extensão de namespace do Shell que atua como um aplicativo separado para mais do que navegar e gerenciar conteúdo no Windows Explorer deve atribuir um AppUserModelID em suas propriedades de pasta. Um exemplo é o Painel de Controle.

  • Em um ambiente de virtualização, como uma estrutura de implantação, o ambiente de virtualização deve atribuir AppUserModelIDs diferentes a cada aplicativo que gerencia. Nesses casos, um iniciador de aplicativos usa um processo intermediário para configurar o ambiente e, em seguida, transfere a operação para um processo diferente para executar o aplicativo. Observe que isso faz com que o sistema não consiga relacionar o processo de destino em execução de volta ao atalho porque o atalho aponta para o processo intermediário.

    Se qualquer aplicativo tiver várias janelas, atalhos ou processos, o AppUserModelID atribuído a esse aplicativo também deverá ser aplicado a cada uma dessas partes pelo ambiente de virtualização.

    Um exemplo dessa situação é a estrutura ClickOnce, que atribui corretamente AppUserModelIDs em nome dos aplicativos que gerencia. Como em todos esses ambientes, os aplicativos implantados e gerenciados pelo ClickOnce não devem atribuir AppUserModelIDs explícitos, porque isso entrará em conflito com os AppUserModelIDs atribuídos pelo ClickOnce e levará a resultados inesperados.

Como formar um Application-Defined AppUserModelID

Um aplicativo deve fornecer seu AppUserModelID no seguinte formato. Não pode ter mais de 128 caracteres e não pode conter espaços. Cada secção deve ser com maiúsculas e minúsculas.

CompanyName.ProductName.SubProduct.VersionInformation

CompanyName e ProductName devem ser sempre utilizados, enquanto as porções SubProduct e VersionInformation são opcionais e dependem dos requisitos da aplicação. SubProduct permite que um aplicativo principal que consiste em vários subaplicativos forneça um botão de barra de tarefas separado para cada subaplicativo e suas janelas associadas. VersionInformation permite que duas versões de um aplicativo coexistam enquanto são vistas como entidades discretas. Se um aplicativo não se destinar a ser usado dessa maneira, o VersionInformation deve ser omitido para que uma versão atualizada possa usar o mesmo AppUserModelID como a versão que substituiu.

Onde atribuir um AppUserModelID

Quando um aplicativo usa um ou mais AppUserModelIDs explícitos, ele deve aplicar esses AppUserModelIDs nos seguintes locais e situações:

  • Na propriedade System.AppUserModel.ID do arquivo de atalho do aplicativo. Um atalho (como um IShellLink, CLSID_ShellLink ou um arquivo .lnk) suporta propriedades por meio IPropertyStore e outros mecanismos de configuração de propriedade usados em todo o Shell. Isso permite que a barra de tarefas identifique o atalho adequado para fixar e garante que as janelas pertencentes ao processo sejam adequadamente associadas a esse botão da barra de tarefas.

    Observação

    A propriedade System.AppUserModel.ID deve ser aplicada a um atalho quando esse atalho é criado. Ao usar o Microsoft Windows Installer (MSI) para instalar o aplicativo, a tabela MsiShortcutProperty permite que o AppUserModelID seja aplicado ao atalho quando ele é criado durante a instalação.

     

  • Como uma propriedade de qualquer uma das janelas em execução do aplicativo. Isso pode ser definido de duas maneiras:

    1. Se diferentes janelas pertencentes a um processo exigirem AppUserModelIDs diferentes para controlar o agrupamento da barra de tarefas, use SHGetPropertyStoreForWindow) para recuperar o repositório de propriedades da janela e definir o AppUserModelID como uma propriedade de janela.
    2. Se todas as janelas no processo usarem o mesmo AppUserModelID, defina o AppUserModelID no processo SetCurrentProcessExplicitAppUserModelID. Um aplicativo deve chamar SetCurrentProcessExplicitAppUserModelID para definir seu AppUserModelID durante a rotina inicial de inicialização de um aplicativo antes que o aplicativo apresente qualquer interface do usuário, faça qualquer manipulação de suas Listas de Atalhos ou faça (ou faça com que o sistema faça) qualquer chamada para SHAddToRecentDocs.

    Um AppUserModelID de nível de janela substitui um AppUserModelID de nível de processo.

    Quando um aplicativo define um AppUserModelID explícito no nível da janela, o aplicativo pode fornecer as especificidades de seu comando de reinicialização para seu botão da barra de tarefas. Para fornecer essas informações, as seguintes propriedades são usadas:

    Observação

    Se existir um atalho para iniciar o aplicativo, um aplicativo deve aplicar o AppUserModelID como uma propriedade do atalho em vez de usar as propriedades de reinicialização. Nesse caso, a linha de comando, o ícone e o texto do atalho são usados para fornecer as mesmas informações que as propriedades de reinicialização.

     

    Um AppUserModelID explícito no nível da janela também pode usar a propriedade System.AppUserModel.PreventPinning para especificar que ela não deve estar disponível para fixação ou reinicialização.

  • Em uma chamada para personalizar ou atualizar (ICustomDestinationList), recuperar (IApplicationDocumentLists), ou limpar (IApplicationDestinations) a Lista de Atalhos do aplicativo.

  • No registo de associação de ficheiros (através do seu ProgID) se a aplicação utilizar as listas de recentes geradas automaticamente pelo sistema ou de destino frequente. Essas informações de associação são referenciadas por SHAddToRecentDocs. Essas informações também são usadas ao adicionar destinos IShellItem a listas de atalhos personalizadas por meio ICustomDestinationList::AppendCategory.

  • Em qualquer chamada que o aplicativo faz diretamente para SHAddToRecentDocs. Se o aplicativo depender da caixa de diálogo de arquivo comum para fazer chamadas para SHAddToRecentDocs em seu nome, essas chamadas poderão deduzir o AppUserModelID explícito somente se o AppUserModelID estiver definido para todo o processo. Se o aplicativo define AppUserModelIDs em suas janelas em vez de no processo, o aplicativo deve fazer todas as chamadas para SHAddToRecentDocs si, com seu AppUserModelID explícito, bem como impedir que a caixa de diálogo de arquivo comum faça suas próprias chamadas. Isso deve ser feito sempre que um item for aberto, para garantir que as seções recentes ou frequente da lista de atalhos do aplicativo sejam precisas.

Os itens a seguir descrevem cenários comuns e onde aplicar AppUserModelIDs explícitos nesses cenários.

  • Quando um único processo contém vários aplicativos, use SHGetPropertyStoreForWindow para recuperar o repositório de propriedades da janela e definir o AppUserModelID como uma propriedade window.
  • Quando um aplicativo usa vários processos, aplique o AppUserModelID a cada processo. Se você usa o mesmo AppUserModelID em cada processo depende se você deseja que cada processo apareça como parte do aplicativo principal ou como entidades individuais.
  • Para separar determinadas janelas de um conjunto no mesmo processo, use o repositório de propriedades da janela para aplicar um único AppUserModelID às janelas que você deseja separar e, em seguida, aplique um AppUserModelID diferente ao processo. Qualquer janela nesse processo que não tenha sido explicitamente rotulada com o AppUserModelID no nível da janela herda o AppUserModelID do processo.
  • Se um tipo de arquivo estiver associado a um aplicativo, atribua o AppUserModelID no ProgID do tipo de arquivo registro. Se um único arquivo executável for iniciado em modos diferentes que aparecem para o usuário como aplicativos distintos, um AppUserModelID separado será necessário para cada modo. Nesse caso, deve haver vários registros ProgID para o tipo de arquivo, cada um com um AppUserModelID diferente.
  • Quando houver vários locais de atalho a partir dos quais um usuário pode iniciar um aplicativo (no menu Iniciar , na área de trabalho ou em outro lugar), recupere o repositório de propriedades do atalho para aplicar um único AppUserModelID a todos os atalhos como propriedades de atalho.
  • Quando uma chamada explícita é feita para SHAddToRecentDocs por um aplicativo, use o AppUserModelID na chamada. Quando a caixa de diálogo de arquivo comum é usada para abrir ou salvar arquivos, SHAddToRecentDocs é chamada pela caixa de diálogo em nome do aplicativo. Essa chamada pode inferir o AppUserModelID explícito do processo. No entanto, se um AppUserModelID explícito for aplicado como uma propriedade window, a caixa de diálogo de arquivo comum não poderá determinar o AppUserModelID correto. Nesse caso, o próprio aplicativo deve chamar explicitamente SHAddToRecentDocs e fornecê-lo com o AppUserModelID correto. Além disso, o aplicativo deve impedir que a caixa de diálogo de arquivo comum chame SHAddToRecentDocs em seu nome, definindo o sinalizador de FOS_DONTADDTORECENT no método GetOptions do GetOptions de IFileOpenDialog ou IFileSaveDialog.

Registrando um aplicativo como um processo de host

Um aplicativo pode definir a entrada de registro IsHostApp para fazer com que o processo do executável seja considerado um processo de host pela barra de tarefas. Isso afeta seu agrupamento e entradas padrão da Lista de Atalhos.

O exemplo a seguir mostra a entrada do Registro necessária. Observe que a entrada não recebe um valor; a sua presença é tudo o que é necessário. É um valor REG_NULL.

HKEY_CLASSES_ROOT
   Applications
      example.exe
         IsHostApp

Se o processo em si ou o arquivo de atalho usado para iniciar o processo tiver um AppUserModelID explícito, a lista de processos do host será ignorada e o aplicativo será tratado como um aplicativo normal pela barra de tarefas. As janelas em execução do aplicativo são agrupadas em um único botão da barra de tarefas e o aplicativo pode ser fixado na barra de tarefas.

Se apenas o nome executável do processo em execução for conhecido, sem um AppUserModelID explícito, e esse executável estiver na lista de processos do host, cada instância do processo será tratada como uma entidade separada para o agrupamento da barra de tarefas. O botão da barra de tarefas associado a qualquer instância específica do processo não exibe uma opção de pino/desafixar ou um ícone de inicialização para uma nova instância do processo. O processo também não é elegível para inclusão na lista de MFU (Most Frequently Used) do menu Iniciar . No entanto, se o processo foi iniciado através de um atalho que contém argumentos de inicialização (geralmente o conteúdo de destino para hospedar como o "aplicativo"), o sistema pode determinar a identidade e o aplicativo pode ser fixado e reiniciado.

Listas de exclusão para fixação na barra de tarefas e listas recentes/frequentes

Aplicativos, processos e janelas podem optar por ficar indisponíveis para fixação na barra de tarefas ou para inclusão na lista MFU do menu Iniciar . Existem três mecanismos para o conseguir:

  1. Adicione a entrada NoStartPage ao registro do aplicativo, conforme mostrado aqui:

    HKEY_CLASSES_ROOT
       Applications
          Example.exe
             NoStartPage
    

    Os dados associados à entrada NoStartPage são ignorados. Apenas a presença da entrada é obrigatória. Portanto, o tipo ideal para NoStartPage é REG_NONE.

    Observe que qualquer uso de um AppUserModelID explícito substitui a entrada NoStartPage. Se um AppUserModelID explícito for aplicado a um atalho, processo ou janela, ele se tornará fixável e elegível para a lista MFU do menu Iniciar .

  2. Defina a propriedade System.AppUserModel.PreventPinning em janelas e atalhos. Esta propriedade deve ser definida em uma janela antes da propriedade PKEY_AppUserModel_ID.

  3. Adicione um AppUserModelID explícito como um valor na seguinte subchave do Registro, conforme mostrado aqui:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      FileAssociation
                         NoStartPageAppUserModelIDs
                            AppUserModelID1
                            AppUserModelID2
                            AppUserModelID3
    

    Cada entrada é um valor REG_NULL com o nome do AppUserModelID. Qualquer AppUserModelID encontrado nesta lista não é fixável e não é elegível para inclusão na lista MFU do menu Iniciar.

Lembre-se de que certos arquivos executáveis, bem como atalhos que contêm determinadas cadeias de caracteres em seu nome, são automaticamente excluídos da fixação e inclusão na lista MFU.

Observação

Essa exclusão automática pode ser substituída aplicando um AppUserModelID explícito.

 

Se qualquer uma das seguintes cadeias de caracteres, independentemente do caso, estiver incluída no nome do atalho, o programa não é fixável e não é exibido na lista usada com mais freqüência (não aplicável ao Windows 10):

  • Documentação
  • Ajuda
  • Instalar
  • Mais informações
  • Leia-me
  • Leia primeiro
  • Leia-me
  • Remover
  • Configuração
  • Suporte
  • O que há de novo

A lista de programas a seguir não pode ser fixada e é excluída da lista usada com mais freqüência.

  • Applaunch.exe
  • Control.exe
  • Dfsvc.exe
  • Dllhost.exe
  • Guestmodemsg.exe
  • Hh.exe
  • Install.exe
  • Isuninst.exe
  • Lnkstub.exe
  • Mmc.exe
  • Mshta.exe
  • Msiexec.exe
  • Msoobe.exe
  • Rundll32.exe
  • Setup.exe
  • St5unst.exe
  • Unwise.exe
  • Unwise32.exe
  • Werfault.exe
  • Winhlp32.exe
  • Wlrmdr.exe
  • Wuapp.exe

As listas anteriores são armazenadas nos seguintes valores do Registro.

Observação

Estas listas não devem ser modificadas por aplicações. Use um dos métodos de lista de exclusão listados anteriormente para a mesma experiência.

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FileAssociation
                     AddRemoveApps
                     HostApps

SetCurrentProcessExplicitAppUserModelID

GetCurrentProcessExplicitAppUserModelID

Extensões da barra de tarefas

ICustomDestinationList::SetAppID

IApplicationDocumentLists::SetAppID

IApplicationDestinations::SetAppID

SHGetPropertyStoreForWindow