Поделиться через


Идентификаторы модели пользователя приложения (Идентификаторы AppUserModelID)

Идентификаторы пользовательских моделей приложений (AppUserModelIDs) широко используются панелью задач в системах Windows 7 и более поздних версий для связывания процессов, файлов и окон с конкретным приложением. В некоторых случаях достаточно полагаться на внутренний Идентификатор AppUserModelID, назначенный процессу системой. Однако приложению, владеющего несколькими процессами, или приложению, запущенному в хост-процессе, может потребоваться явно идентифицировать себя, чтобы оно могло сгруппировать свои разнородные окна под одной кнопкой панели задач и управлять содержимым списка переходов этого приложения.

идентификаторы Application-Defined и System-Defined AppUserModel

Некоторые приложения не объявляют явный Идентификатор AppUserModelID. Они являются необязательными. В этом случае система использует ряд эвристических средств для назначения внутреннего идентификатора AppUserModelID. Тем не менее, есть преимущество производительности, чтобы избежать этих вычислений, и явный AppUserModelID является единственным способом гарантировать точное взаимодействие с пользователем. Поэтому настоятельно рекомендуется задать явный идентификатор. Приложения не могут получить назначаемый системой Идентификатор AppUserModelID.

Если приложение использует явный идентификатор AppUserModelID, оно также должно назначить тот же Идентификатор AppUserModelID всем запущенным окнам или процессам, ярлыкам и сопоставлениям файлов. Он также должен использовать AppUserModelID при настройке списка переходов через ICustomDestinationList и во всех вызовах SHAddToRecentDocs.

Примечание

Если у приложений нет явного идентификатора AppUserModelID, они должны вызывать методы IApplicationDestinations, IApplicationDocumentLists и ICustomDestinationList , а также SHAddToRecentDocs из приложения. Если эти методы вызываются из другого процесса, например установщика или средства удаления, система не может создать правильный Идентификатор AppUserModelID, и эти вызовы не будут иметь никакого эффекта.

 

Ниже описаны распространенные сценарии, требующие явного идентификатора AppUserModelID. Они также указывают на случаи, когда следует использовать несколько явных идентификаторов AppUserModelID.

  • Один исполняемый файл с пользовательским интерфейсом с несколькими режимами, которые отображаются для пользователя как отдельные приложения, должны назначать разные идентификаторы AppUserModel ДЛЯ каждого режима. Например, часть приложения, которую пользователи видят как независимый интерфейс, который они могут закреплять и запускать с панели задач отдельно от остальной части приложения, должна иметь собственный Идентификатор AppUserModelID, отдельный от main интерфейса.

  • Несколько сочетаний клавиш с разными аргументами, которые приводят к тому, что пользователь видит, как одно и то же приложение, должно использовать один Идентификатор AppUserModelID для всех ярлыков. Например, windows Internet Обозреватель имеет разные сочетания клавиш для разных режимов (например, запуск без надстроек), но все они должны отображаться для пользователя как один экземпляр Обозреватель Интернета.

  • Исполняемый файл, который выступает в качестве ведущего процесса и выполняет целевое содержимое в качестве приложения, должен зарегистрироваться как ведущее приложение, после чего он может назначать разные идентификаторы AppUserModelID для каждого воспринимаемого интерфейса, который он размещает. Кроме того, ведущий процесс может разрешить размещенной программе задать свои идентификаторы AppUserModelID. В любом случае хост-процесс должен вести запись об источнике идентификаторов AppUserModelID либо о себе, либо о размещенном приложении. В этом случае основной пользовательский интерфейс ведущего процесса отсутствует без целевого содержимого. Примерами могут быть приложения удаленного доступа Windows, интегрированные локально (RAIL), среда выполнения Java, RunDLL32.exe или DLLHost.exe.

    В случае существующих размещенных приложений система пытается определить отдельные возможности, но новые приложения должны использовать явные идентификаторы AppUserModel, чтобы гарантировать предполагаемое взаимодействие с пользователем.

  • Кооперированные или связанные процессы, которые для пользователя являются частью одного приложения, должны иметь один и тот же Идентификатор AppUserModelID, примененный к каждому процессу. Примеры включают игры с процессом запуска (в цепочке) и Microsoft Медиаплеер Windows, которые имеют интерфейс первого запуска и настройки, выполняемый в одном процессе, а main приложение, запущенное в другом процессе (совместно).

  • Расширение пространства имен оболочки, которое выступает в качестве отдельного приложения для просмотра содержимого и управления содержимым в Windows Обозреватель должно назначить AppUserModelID в свойствах папки. Примером является панель управления.

  • В среде виртуализации, такой как платформа развертывания, среда виртуализации должна назначать разные идентификаторы AppUserModelID каждому приложению, которым она управляет. В таких случаях средство запуска приложений использует промежуточный процесс для настройки среды, а затем передает операцию другому процессу для запуска приложения. Обратите внимание, что это приводит к тому, что системе не удается связать выполняющийся целевой процесс с ярлыком, так как ярлык указывает на промежуточный процесс.

    Если какое-либо приложение имеет несколько окон, ярлыков или процессов, среда виртуализации также должна применять назначенный им идентификатор AppUserModelID к каждому из этих элементов.

    Примером такой ситуации является платформа ClickOnce, которая правильно назначает Идентификаторы AppUserModelID от имени приложений, которыми она управляет. Как и во всех таких средах, приложения, развернутые и управляемые ClickOnce, не должны назначать явные идентификаторы AppUserModelID сами, так как это приведет к конфликту с идентификаторами AppUserModelID, назначенными ClickOnce, и приведет к непредвиденным результатам.

Как сформировать Application-Defined AppUserModelID

Приложение должно предоставить свой идентификатор AppUserModelID в следующей форме. Он может содержать не более 128 символов и не может содержать пробелы. Каждый раздел должен иметь регистр pascal.

CompanyName.ProductName.SubProduct.VersionInformation

CompanyName и ProductName следует всегда использовать, в то время как SubProduct части и VersionInformation являются необязательными и зависят от требований приложения. SubProductпозволяет приложению main, состоящему из нескольких вложенных приложений, предоставлять отдельную кнопку панели задач для каждого вложенного приложения и связанных с ним окон. VersionInformation позволяет сосуществовать двум версиям приложения, рассматривая их как дискретные сущности. Если приложение не предназначено для использования таким образом, следует опустить, VersionInformation чтобы обновленная версия использовала тот же AppUserModelID, что и версия, которую она заменила.

Где назначить Идентификатор AppUserModelID

Если приложение использует один или несколько явных идентификаторов AppUserModelID, оно должно применять эти идентификаторы AppUserModelID в следующих расположениях и ситуациях:

  • В свойстве System.AppUserModel.ID файла ярлыка приложения. Ярлык (как IShellLink, CLSID_ShellLink или LNK-файл) поддерживает свойства через IPropertyStore и другие механизмы настройки свойств, используемые в оболочке. Это позволяет панели задач определить подходящий ярлык для закрепления и гарантирует, что окна, принадлежащие процессу, будут соответствующим образом связаны с этой кнопкой панели задач.

    Примечание

    Свойство System.AppUserModel.ID должно применяться к ярлыку при создании этого ярлыка. При использовании установщика Microsoft Windows (MSI) для установки приложения таблица MsiShortcutProperty позволяет применять AppUserModelID к ярлыку при его создании во время установки.

     

  • Как свойство любого из работающих окон приложения. Это можно задать одним из двух способов:

    1. Если разным окнам, принадлежащим одному процессу, требуются разные идентификаторы AppUserModelID для управления группировкой на панели задач, используйте SHGetPropertyStoreForWindow), чтобы получить хранилище свойств окна и задать AppUserModelID в качестве свойства окна.
    2. Если во всех окнах процесса используется один и тот же Идентификатор AppUserModelID, задайте AppUserModelID для процесса, используя SetCurrentProcessExplicitAppUserModelID. Приложение должно вызвать SetCurrentProcessExplicitAppUserModelID , чтобы задать appUserModelID во время процедуры начального запуска приложения, прежде чем приложение представит какой-либо пользовательский интерфейс, выполняет какие-либо операции со списками переходов или выполняет (или заставляет систему выполнять) любой вызов SHAddToRecentDocs.

    AppUserModelID на уровне окна переопределяет AppUserModelID на уровне процесса.

    Когда приложение задает явный идентификатор AppUserModelID на уровне окна, приложение может предоставить особенности команды повторного запуска для кнопки панели задач. Для предоставления этой информации используются следующие свойства:

    Примечание

    Если для запуска приложения существует ярлык, приложение должно применить AppUserModelID в качестве свойства ярлыка вместо использования свойств повторного запуска. В этом случае командная строка, значок и текст ярлыка используются для предоставления той же информации, что и свойства повторного запуска.

     

    Явное значение AppUserModelID на уровне окна также может использовать свойство System.AppUserModel.PreventPinning , чтобы указать, что оно не должно быть доступно для закрепления или повторного запуска.

  • В вызове для настройки или обновления (ICustomDestinationList) извлекает (IApplicationDocumentLists) или очищает (IApplicationDestinations) список переходов приложения.

  • При регистрации сопоставления файлов (через его ProgID), если приложение использует автоматически созданные системой списки последних или частых назначений . На эти сведения о связи ссылается SHAddToRecentDocs. Эти сведения также используются при добавлении назначений IShellItem в настраиваемые списки переходов с помощью ICustomDestinationList::AppendCategory.

  • При любом вызове приложение выполняет непосредственно в SHAddToRecentDocs. Если приложение зависит от общего диалогового окна файлов для выполнения вызовов SHAddToRecentDocs от его имени, эти вызовы могут выводить явный AppUserModelID только в том случае, если AppUserModelID задан для всего процесса. Если приложение задает AppUserModelIDs в своих окнах, а не в процессе, приложение должно выполнять все вызовы самого SHAddToRecentDocs с явным идентификатором AppUserModelID, а также запретить обычным диалоговым окнам файлов выполнять собственные вызовы. Это необходимо сделать при каждом открытии элемента, чтобы обеспечить точность разделов Последние или Частые в списке переходов приложения.

В следующих элементах описаны распространенные сценарии и места применения явных идентификаторов AppUserModelID в этих сценариях.

  • Если один процесс содержит несколько приложений, используйте SHGetPropertyStoreForWindow , чтобы получить хранилище свойств окна и задать AppUserModelID в качестве свойства окна.
  • Если приложение использует несколько процессов, примените AppUserModelID к каждому процессу. Использование одного и того же идентификатора AppUserModelID для каждого процесса зависит от того, как вы хотите, чтобы каждый процесс отображался как часть приложения main или как отдельные сущности.
  • Чтобы отделить определенные окна от набора в том же процессе, используйте хранилище свойств окна, чтобы применить один идентификатор AppUserModelID к тем окнам, которые требуется разделить, а затем применить к процессу другой AppUserModelID. Любое окно в этом процессе, которое не было явно помечено AppUserModelID на уровне окна, наследует AppUserModelID процесса.
  • Если тип файла связан с приложением, назначьте AppUserModelID в регистрации ProgID этого типа файла. Если один исполняемый файл запускается в разных режимах, которые кажутся пользователю отдельными приложениями, для каждого режима требуется отдельный Идентификатор AppUserModelID. В этом случае для типа файла должно быть несколько регистраций ProgID, каждая из которых имеет свой идентификатор AppUserModelID.
  • При наличии нескольких расположений ярлыков, из которых пользователь может запустить приложение (в меню "Пуск" , на рабочем столе или в другом месте), извлеките хранилище свойств ярлыка, чтобы применить один идентификатор AppUserModelID ко всем ярлыкам в качестве свойств ярлыка.
  • При явном вызове SHAddToRecentDocs приложением используйте в вызове AppUserModelID. Если для открытия или сохранения файлов используется диалоговое окно общего файла, функция SHAddToRecentDocs вызывается диалогом от имени приложения. Этот вызов может вывести явный идентификатор AppUserModelID из процесса. Однако если явный идентификатор AppUserModelID применяется в качестве свойства окна, диалоговое окно общего файла не может определить правильный Идентификатор AppUserModelID. В этом случае само приложение должно явно вызвать SHAddToRecentDocs и предоставить ему правильный Идентификатор AppUserModelID. Кроме того, приложение должно предотвратить вызов SHAddToRecentDocs в диалоговом окне общего файла от его имени, установив флаг FOS_DONTADDTORECENT в методе GetOptionsметода IFileOpenDialog или IFileSaveDialog.

Регистрация приложения в качестве ведущего процесса

Приложение может задать запись реестра IsHostApp, чтобы на панели задач этот исполняемый процесс считался ведущим процессом. Это влияет на его группирование и записи списка переходов по умолчанию.

В следующем примере показана необходимая запись реестра. Обратите внимание, что записи не присваивается значение; его присутствие — это все, что требуется. Это REG_NULL значение.

HKEY_CLASSES_ROOT
   Applications
      example.exe
         IsHostApp

Если либо сам процесс, либо файл ярлыка, используемый для запуска процесса, имеет явный Идентификатор AppUserModelID, то список хост-процессов игнорируется и приложение рассматривается панелью задач как обычное приложение. Работающие окна приложения группируются под одной кнопкой панели задач, и приложение можно закрепить на панели задач.

Если известно только имя исполняемого файла выполняющегося процесса без явного идентификатора AppUserModelID и этот исполняемый файл находится в списке хост-процессов, то каждый экземпляр процесса рассматривается как отдельная сущность для группирования на панели задач. Кнопка панели задач, связанная с каким-либо конкретным экземпляром процесса, не отображает параметр закрепить или открепить или значок запуска для нового экземпляра процесса. Этот процесс также не может быть включен в список наиболее часто используемых (MFU) меню "Пуск ". Однако если процесс был запущен с помощью ярлыка, содержащего аргументы запуска (обычно целевое содержимое для размещения в качестве "приложения"), система может определить удостоверение, а приложение можно закрепить и повторно запустить.

Списки исключений для закрепления на панели задач и последних и частых списков

Приложения, процессы и окна могут сделать себя недоступными для закрепления на панели задач или для включения в список MFU меню "Пуск ". Для этого существует три механизма:

  1. Добавьте запись NoStartPage в регистрацию приложения, как показано ниже:

    HKEY_CLASSES_ROOT
       Applications
          Example.exe
             NoStartPage
    

    Данные, связанные с записью NoStartPage, игнорируются. Требуется только наличие записи. Поэтому идеальным типом для NoStartPage является REG_NONE.

    Обратите внимание, что любое использование явного AppUserModelID переопределяет запись NoStartPage. Если к ярлыку, процессу или окну применяется явный Идентификатор AppUserModelID, он становится закрепляемым и доступен для списка MFU меню "Пуск ".

  2. Задайте свойство System.AppUserModel.PreventPinning в окнах и ярлыках. Это свойство должно быть задано в окне перед свойством PKEY_AppUserModel_ID .

  3. Добавьте явное значение AppUserModelID в следующем подразделе реестра, как показано ниже:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      FileAssociation
                         NoStartPageAppUserModelIDs
                            AppUserModelID1
                            AppUserModelID2
                            AppUserModelID3
    

    Каждая запись представляет собой REG_NULL значение с именем AppUserModelID. Любой объект AppUserModelID, найденный в этом списке, не может быть закреплен и не может быть включен в список MFU меню "Пуск ".

Имейте в виду, что некоторые исполняемые файлы, а также ярлыки, содержащие определенные строки в имени, автоматически исключаются из закрепления и включения в список MFU.

Примечание

Это автоматическое исключение можно переопределить, применив явный AppUserModelID.

 

Если в имя ярлыка включена какая-либо из следующих строк, независимо от регистра, программа не закрепляется и не отображается в списке наиболее часто используемых (не применимо к Windows 10):

  • Документация
  • Справка
  • Установка
  • Подробнее
  • Прочитать меня
  • Сначала прочитать
  • Readme
  • Удалить
  • Настройка
  • Поддержка
  • What's New

Приведенный ниже список программ не поддерживает закрепление и исключается из списка наиболее часто используемых программ.

  • 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

Предыдущие списки хранятся в следующих значениях реестра.

Примечание

Эти списки не должны изменяться приложениями. Используйте один из методов списка исключений, перечисленных ранее для того же интерфейса.

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FileAssociation
                     AddRemoveApps
                     HostApps

SetCurrentProcessExplicitAppUserModelID

GetCurrentProcessExplicitAppUserModelID

Расширения панели задач

ICustomDestinationList::SetAppID

IApplicationDocumentLists::SetAppID

IApplicationDestinations::SetAppID

SHGetPropertyStoreForWindow