Identificadores de modelo de usuario de aplicación (AppUserModelID)

La barra de tareas de windows 7 y sistemas posteriores usan ampliamente los identificadores de modelo de usuario de la aplicación (AppUserModelID) para asociar procesos, archivos y ventanas con una aplicación determinada. En algunos casos, es suficiente confiar en el appUserModelID interno asignado a un proceso por el sistema. Sin embargo, una aplicación que posee varios procesos o una aplicación que se ejecuta en un proceso host podría necesitar identificarse explícitamente para que pueda agrupar sus ventanas dispares en un solo botón de barra de tareas y controlar el contenido de la lista de accesos directos de esa aplicación.

Application-Defined y System-Defined AppUserModelIDs

Algunas aplicaciones no declaran un AppUserModelID explícito. Son opcionales. En ese caso, el sistema usa una serie de heurística para asignar un AppUserModelID interno. Sin embargo, existe una ventaja de rendimiento para evitar esos cálculos y un AppUserModelID explícito es la única manera de garantizar una experiencia de usuario exacta. Por lo tanto, se recomienda encarecidamente establecer un identificador explícito. Las aplicaciones no pueden recuperar un AppUserModelID asignado por el sistema.

Si una aplicación usa un AppUserModelID explícito, también debe asignar el mismo AppUserModelID a todas las ventanas o procesos en ejecución, accesos directos y asociaciones de archivo. También debe usar ese AppUserModelID al personalizar su Jump List a través de ICustomDestinationList y en cualquier llamada a SHAddToRecentDocs.

Nota

Si las aplicaciones no tienen un AppUserModelID explícito, deben llamar a métodos IApplicationDestinations, IApplicationDocumentLists e ICustomDestinationList , así como SHAddToRecentDocs desde dentro de la aplicación. Si se llama a esos métodos desde otro proceso, como un instalador o un desinstalador, el sistema no puede generar el AppUserModelID correcto y esas llamadas no tendrán ningún efecto.

 

Los siguientes elementos describen escenarios comunes que requieren un AppUserModelID explícito. También señalan casos en los que se deben usar varios AppUserModelID explícitos.

  • Un único archivo ejecutable con una interfaz de usuario con varios modos que aparecen al usuario como aplicaciones independientes debe asignar diferentes AppUserModelID a cada modo. Por ejemplo, una parte de una aplicación que los usuarios ven como una experiencia independiente a la que pueden anclar e iniciar desde la barra de tareas por separado del resto de la aplicación deben tener su propio AppUserModelID, independiente de la experiencia principal.

  • Varios accesos directos con argumentos diferentes que conducen a lo que el usuario ve como la misma aplicación debe usar un AppUserModelID para todos los accesos directos. Por ejemplo, Windows Internet Explorer tiene diferentes accesos directos para diferentes modos (como iniciar sin complementos), pero todos deberían aparecer al usuario como una única instancia de Internet Explorer.

  • Un archivo ejecutable que actúa como un proceso de host y ejecuta el contenido de destino como una aplicación debe registrarse como una aplicación host, después de lo cual puede asignar diferentes AppUserModelID a cada experiencia percibida que hospeda. Como alternativa, el proceso de host puede permitir que el programa hospedado establezca sus AppUserModelIDs. En cualquier caso, el proceso de host debe mantener un registro del origen de los AppUserModelID, ya sea por sí mismo o la aplicación hospedada. En este caso, no hay ninguna experiencia de usuario principal del proceso de host sin el contenido de destino. Algunos ejemplos son aplicaciones remotas de Windows integradas localmente (RAIL), java runtime, RunDLL32.exe o DLLHost.exe.

    En el caso de las aplicaciones hospedadas existentes, el sistema intenta identificar experiencias individuales, pero las nuevas aplicaciones deben usar appUserModelID explícitos para garantizar la experiencia de usuario prevista.

  • Los procesos cooperativos o encadenados que al usuario forman parte de la misma aplicación deben tener el mismo AppUserModelID aplicado a cada proceso. Algunos ejemplos incluyen juegos con un proceso de iniciador (encadenado) y Microsoft Reproductor multimedia de Windows, que tiene una experiencia de primera ejecución o configuración que se ejecuta en un proceso y la aplicación principal que se ejecuta en otro proceso (cooperativo).

  • Una extensión de espacio de nombres de Shell que actúa como una aplicación independiente para más que examinar y administrar contenido en el Explorador de Windows debe asignar un AppUserModelID en sus propiedades de carpeta. Un ejemplo es el Panel de control.

  • En un entorno de virtualización, como un marco de implementación, el entorno de virtualización debe asignar diferentes AppUserModelID a cada aplicación que administra. En estos casos, un iniciador de aplicaciones usa un proceso intermediario para configurar el entorno y, a continuación, entrega la operación a otro proceso para ejecutar la aplicación. Tenga en cuenta que esto hace que el sistema no pueda relacionar el proceso de destino en ejecución con el acceso directo porque el acceso directo apunta al proceso intermediario.

    Si alguna aplicación tiene varias ventanas, accesos directos o procesos, el appUserModelID asignado a esa aplicación también se debe aplicar a cada una de esas partes mediante el entorno de virtualización.

    Un ejemplo de esta situación es el marco ClickOnce, que asigna correctamente AppUserModelIDs en nombre de las aplicaciones que administra. Como en todos estos entornos, las aplicaciones implementadas y administradas por ClickOnce no deben asignarse a sí mismos appUserModelID explícitos, ya que si lo hace, entrará en conflicto con los AppUserModelID asignados por ClickOnce y provocarán resultados inesperados.

Cómo formar un appUserModelID de Application-Defined

Una aplicación debe proporcionar su AppUserModelID en el siguiente formato. No puede tener más de 128 caracteres y no puede contener espacios. Cada sección debe estar en mayúsculas y minúsculas pascales.

CompanyName.ProductName.SubProduct.VersionInformation

CompanyName y ProductName siempre deben usarse, mientras que las SubProduct partes y VersionInformation son opcionales y dependen de los requisitos de la aplicación. SubProduct permite que una aplicación principal que consta de varias subaplicaciones proporcione un botón de barra de tareas independiente para cada subaplicación y sus ventanas asociadas. VersionInformation permite que dos versiones de una aplicación coexistan mientras se ven como entidades discretas. Si una aplicación no está pensada para usarse de esa manera, VersionInformation se debe omitir para que una versión actualizada pueda usar el mismo AppUserModelID que la versión que ha reemplazado.

Dónde asignar un AppUserModelID

Cuando una aplicación usa uno o varios AppUserModelID explícitos, debe aplicar esos AppUserModelID en las siguientes ubicaciones y situaciones:

  • En la propiedad System.AppUserModel.ID del archivo de acceso directo de la aplicación. Un acceso directo (como IShellLink, CLSID_ShellLink o un archivo .lnk) admite propiedades a través de IPropertyStore y otros mecanismos de configuración de propiedades usados en todo el Shell. Esto permite que la barra de tareas identifique el acceso directo adecuado para anclar y garantiza que las ventanas que pertenecen al proceso estén asociadas correctamente con ese botón de la barra de tareas.

    Nota

    La propiedad System.AppUserModel.ID debe aplicarse a un acceso directo cuando se crea ese acceso directo. Cuando se usa Microsoft Windows Installer (MSI) para instalar la aplicación, la tabla MsiShortcutProperty permite aplicar appUserModelID al acceso directo cuando se crea durante la instalación.

     

  • Como propiedad de cualquiera de las ventanas en ejecución de la aplicación. Esto se puede establecer de una de estas dos maneras:

    1. Si diferentes ventanas que pertenecen a un proceso requieren diferentes AppUserModelIDs para controlar la agrupación de la barra de tareas, use SHGetPropertyStoreForWindow) para recuperar el almacén de propiedades de la ventana y establecer appUserModelID como una propiedad de ventana.
    2. Si todas las ventanas del proceso usan el mismo AppUserModelID, establezca appUserModelID en el proceso a través de SetCurrentProcessExplicitAppUserModelID. Una aplicación debe llamar a SetCurrentProcessExplicitAppUserModelID para establecer su AppUserModelID durante la rutina de inicio inicial de una aplicación antes de que la aplicación presente cualquier interfaz de usuario, realice cualquier manipulación de sus listas de accesos directos o realice (o hace que el sistema realice) cualquier llamada a SHAddToRecentDocs.

    Un AppUserModelID de nivel de ventana invalida un AppUserModelID de nivel de proceso.

    Cuando una aplicación establece un AppUserModelID explícito en el nivel de ventana, la aplicación puede proporcionar los detalles de su comando de relanzamiento para su botón de barra de tareas. Para proporcionar esa información, se usan las siguientes propiedades:

    Nota

    Si existe un acceso directo para iniciar la aplicación, una aplicación debe aplicar appUserModelID como una propiedad del acceso directo en lugar de usar las propiedades de relanzamiento. En ese caso, la línea de comandos, el icono y el texto del acceso directo se usan para proporcionar la misma información que las propiedades de relanzamiento.

     

    Un AppUserModelID explícito de nivel de ventana también puede usar la propiedad System.AppUserModel.PreventPinning para especificar que no debe estar disponible para anclar o volver a iniciar.

  • En una llamada para personalizar o actualizar (ICustomDestinationList), recuperar (IApplicationDocumentLists) o borrar (IApplicationDestinations) la jump List de la aplicación.

  • En el registro de asociación de archivos (a través de su ProgID) si la aplicación usa las listas de destino recientes o frecuentes generadas automáticamente del sistema. ShAddToRecentDocs hace referencia a esta información de asociación. Esta información también se usa al agregar destinos IShellItem a listas de accesos directos personalizados a través de ICustomDestinationList::AppendCategory.

  • En cualquier llamada que la aplicación realiza directamente a SHAddToRecentDocs. Si la aplicación depende del cuadro de diálogo de archivo común para realizar llamadas a SHAddToRecentDocs en su nombre, esas llamadas pueden deducir el AppUserModelID explícito solo si appUserModelID está establecido para todo el proceso. Si la aplicación establece AppUserModelIDs en sus ventanas en lugar de en el proceso, la aplicación debe realizar todas las llamadas a SHAddToRecentDocs , con su AppUserModelID explícito, así como impedir que el cuadro de diálogo de archivo común realice sus propias llamadas. Esto se debe hacer cada vez que se abra un elemento para asegurarse de que las secciones recientes o frecuentes de la lista de accesos directos de la aplicación sean precisas.

En los siguientes elementos se describen escenarios comunes y dónde aplicar appUserModelID explícitos en esos escenarios.

  • Cuando un único proceso contiene varias aplicaciones, use SHGetPropertyStoreForWindow para recuperar el almacén de propiedades de la ventana y establecer appUserModelID como una propiedad de ventana.
  • Cuando una aplicación usa varios procesos, aplique appUserModelID a cada proceso. Si usa el mismo AppUserModelID en cada proceso depende de si desea que cada proceso aparezca como parte de la aplicación principal o como entidades individuales.
  • Para separar determinadas ventanas de un conjunto en el mismo proceso, use el almacén de propiedades de la ventana para aplicar un único AppUserModelID a esas ventanas que quiera separar y, a continuación, aplique un appUserModelID diferente al proceso. Cualquier ventana de ese proceso que no se etiquetó explícitamente con el appUserModelID de nivel de ventana hereda el AppUserModelID del proceso.
  • Si un tipo de archivo está asociado a una aplicación, asigne el AppUserModelID en el registro progID del tipo de archivo. Si se inicia un único archivo ejecutable en diferentes modos que aparecen al usuario como aplicaciones distintas, se requiere un appUserModelID independiente para cada modo. En ese caso, debe haber varios registros de ProgID para el tipo de archivo, cada uno con un AppUserModelID diferente.
  • Cuando hay varias ubicaciones de acceso directo desde las que un usuario puede iniciar una aplicación (en el menú Inicio , en el escritorio o en otro lugar) recuperar el almacén de propiedades del acceso directo para aplicar un único AppUserModelID a todos los accesos directos como propiedades de acceso directo.
  • Cuando una aplicación realiza una llamada explícita a SHAddToRecentDocs , use appUserModelID en la llamada. Cuando se usa el cuadro de diálogo de archivo común para abrir o guardar archivos, el diálogo llama a SHAddToRecentDocs en nombre de la aplicación. Esa llamada puede deducir el AppUserModelID explícito del proceso. Sin embargo, si se aplica un AppUserModelID explícito como una propiedad de ventana, el cuadro de diálogo de archivo común no puede determinar el AppUserModelID correcto. En ese caso, la propia aplicación debe llamar explícitamente a SHAddToRecentDocs y proporcionarla con el AppUserModelID correcto. Además, la aplicación debe impedir que el cuadro de diálogo de archivo común llame a SHAddToRecentDocs en su nombre estableciendo la marca FOS_DONTADDTORECENT en el método GetOptions de IFileOpenDialog o IFileSaveDialog.

Registro de una aplicación como proceso de host

Una aplicación puede establecer la entrada del Registro IsHostApp para que el proceso del ejecutable se considere un proceso host mediante la barra de tareas. Esto afecta a su agrupación y a las entradas predeterminadas de Jump List.

En el ejemplo siguiente se muestra la entrada del Registro necesaria. Tenga en cuenta que la entrada no tiene asignado un valor; su presencia es todo lo necesario. Es un valor de REG_NULL.

HKEY_CLASSES_ROOT
   Applications
      example.exe
         IsHostApp

Si el propio proceso o el archivo de acceso directo que se usa para iniciar el proceso tiene un AppUserModelID explícito, la lista de procesos de host se omite y la aplicación se trata como una aplicación normal mediante la barra de tareas. Las ventanas en ejecución de la aplicación se agrupan en un solo botón de la barra de tareas y la aplicación se puede anclar a la barra de tareas.

Si solo se conoce el nombre ejecutable del proceso en ejecución, sin un AppUserModelID explícito y ese ejecutable está en la lista de procesos de host, cada instancia del proceso se trata como una entidad independiente para la agrupación de la barra de tareas. El botón de la barra de tareas asociado a cualquier instancia específica del proceso no muestra una opción de anclar o desanclar ni un icono de inicio para una nueva instancia del proceso. El proceso tampoco es apto para su inclusión en la lista De uso más frecuente (MFU) del menú Inicio . Sin embargo, si el proceso se inició a través de un acceso directo que contiene argumentos de inicio (normalmente el contenido de destino que se va a hospedar como la "aplicación"), el sistema puede determinar la identidad y la aplicación se puede anclar y volver a iniciar.

Listas de exclusión para anclar la barra de tareas y las listas recientes o frecuentes

Las aplicaciones, los procesos y las ventanas pueden optar por dejar de estar disponibles para anclar a la barra de tareas o para su inclusión en la lista MFU del menú Inicio . Hay tres mecanismos para lograrlo:

  1. Agregue la entrada NoStartPage al registro de la aplicación, como se muestra aquí:

    HKEY_CLASSES_ROOT
       Applications
          Example.exe
             NoStartPage
    

    Se omiten los datos asociados a la entrada NoStartPage. Solo se requiere la presencia de la entrada. Por lo tanto, el tipo ideal para NoStartPage es REG_NONE.

    Tenga en cuenta que cualquier uso de un AppUserModelID explícito invalida la entrada NoStartPage. Si se aplica un AppUserModelID explícito a un acceso directo, proceso o ventana, se vuelve anclable y es apto para la lista MFU del menú Inicio .

  2. Establezca la propiedad System.AppUserModel.PreventPinning en ventanas y accesos directos. Esta propiedad debe establecerse en una ventana antes de la propiedad PKEY_AppUserModel_ID .

  3. Agregue un AppUserModelID explícito como un valor en la siguiente subclave del Registro, como se muestra aquí:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      FileAssociation
                         NoStartPageAppUserModelIDs
                            AppUserModelID1
                            AppUserModelID2
                            AppUserModelID3
    

    Cada entrada es un valor REG_NULL con el nombre de AppUserModelID. Cualquier AppUserModelID encontrado en esta lista no se puede anclar y no es apto para su inclusión en la lista MFU del menú Inicio .

Tenga en cuenta que ciertos archivos ejecutables, así como los accesos directos que contienen determinadas cadenas en su nombre, se excluyen automáticamente del anclaje y la inclusión en la lista de MFU.

Nota

Esta exclusión automática se puede invalidar aplicando un AppUserModelID explícito.

 

Si alguna de las siguientes cadenas, independientemente del caso, se incluye en el nombre del acceso directo, el programa no se puede anclar y no se muestra en la lista de uso más frecuente (no aplicable a Windows 10):

  • Documentación
  • Ayuda
  • Instalar
  • Más información
  • Léame
  • Leer primero
  • Léame
  • Quitar
  • Configurar
  • Soporte técnico
  • Novedades

La siguiente lista de programas no se puede anclar y se excluye de la lista de uso más frecuente.

  • 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

Las listas anteriores se almacenan en los siguientes valores del Registro.

Nota

Las aplicaciones no deben modificar estas listas. Use uno de los métodos de lista de exclusión enumerados anteriormente para la misma experiencia.

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FileAssociation
                     AddRemoveApps
                     HostApps

SetCurrentProcessExplicitAppUserModelID

GetCurrentProcessExplicitAppUserModelID

Extensiones de la barra de tareas

ICustomDestinationList::SetAppID

IApplicationDocumentLists::SetAppID

IApplicationDestinations::SetAppID

SHGetPropertyStoreForWindow