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


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

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

Application-Defined и System-Defined AppUserModelIDs

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

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

Заметка

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

 

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

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

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

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

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

  • Совместные или цепные процессы, которые являются частью одного и того же приложения, должны применяться к каждому процессу. Примеры включают игры с процессом запуска (цепочкой) и проигрывателем Microsoft Windows Media, который имеет первый запуск или настройку в одном процессе и основное приложение, работающее в другом процессе (совместно).

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

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

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

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

Создание Application-Defined AppUserModelID

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

CompanyName.ProductName.SubProduct.VersionInformation

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

Где назначить AppUserModelID

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

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

    Заметка

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

     

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

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

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

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

    Заметка

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

     

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

  • При вызове настройки или обновления (ICustomDestinationList), получения (IApplicationDocumentLists) или очистки (IApplicationDestinationDestinations) списка переходов приложения.

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

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

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

  • Если один процесс содержит несколько приложений, используйте SHGetPropertyStoreForWindow для получения хранилища свойств окна и задания AppUserModelID в качестве свойства окна.
  • Если приложение использует несколько процессов, примените AppUserModelID к каждому процессу. Независимо от того, используется ли один и тот же AppUserModelID для каждого процесса, зависит от того, нужно ли отображать каждый процесс как часть основного приложения или как отдельные сущности.
  • Чтобы отделить определенные окна от набора в том же процессе, используйте хранилище свойств окна для применения одного AppUserModelID к тем окнам, которые вы хотите разделить, а затем примените к процессу другой AppUserModelID. Любое окно в этом процессе, которое не было явно помечено приложением AppUserModelID уровня окна, наследует AppUserModelID процесса.
  • Если тип файла связан с приложением, назначьте AppUserModelID в регистрации типа файла. Если один исполняемый файл запускается в разных режимах, которые отображаются пользователем в виде отдельных приложений, для каждого режима требуется отдельный файл AppUserModelID. В этом случае должно быть несколько регистраций ProgID для типа файла, каждый из которых имеет разные идентификаторы AppUserModelID.
  • Если есть несколько ярлыков, из которых пользователь может запустить приложение (в меню Пуск на рабочем столе или в другом месте) извлеките хранилище свойств ярлыка, чтобы применить один AppUserModelID ко всем ярлыкам в качестве сочетаний свойств.
  • Когда явный вызов выполняется для SHAddToRecentDocs приложением, используйте AppUserModelID в вызове. Если для открытия или сохранения файлов используется общее диалоговое окно, SHAddToRecentDocs вызывается диалогом от имени приложения. Этот вызов может выводить явный AppUserModelID из процесса. Однако если явное свойство AppUserModelID применяется в качестве свойства окна, общее диалоговое окно файла не может определить правильный AppUserModelID. В этом случае само приложение должно явно вызывать SHAddToRecentDocs и предоставить его правильным AppUserModelID. Кроме того, приложение должно предотвратить вызов SHAddToRecentDocs от его имени, задав флаг FOS_DONTADDTORECENT в методе GetOptions GetOptionsIFileOpenDialog или 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
  • Убирать
  • Настройка
  • Поддержка
  • Новые возможности

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

  • 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