Как по appid узнать приложение
Это первая статья в новом цикле, посвященных панели задач Windows 7. Разработчикам стоит уделять панели задач первоочередное внимание. Мы должны понять новые возможности панели, чтобы создавать приложения, эффективно работающие с ней, чтобы расширить возможности пользователей и сделать их работу с ОС максимально удобной.
Я полагаю, что вы успели ознакомиться с базовой функциональностью и нововведениями панели задач Windows 7. Если же вы не знакомы, рекомендую вам посмотреть видео-обзор функциональных возможностей панели задач Windows 7 на Channel 9 и прочитать статьи в блоге E7 . Это позволит вам лучше понять, о чем идет речь в сегодняшней в статье.
При первом запуске системы новая панель задач, пожалуй, является наиболее заметным нововведением в Windows 7. В Windows 7 панель задач представляет собой механизм для запуска приложений и переключения окон, консолидирующим возможности панелей задач из предыдущих версий Windows и, в частности, панель быстрого запуска, недавние документы, уведомления и окна запущенных приложений. В дополнение к старым возможностям панель задач Windows 7 обладает новыми: списками быстрого перехода, интерактивными миниатюрами открытых окон и т.п. Но для начала давайте заложим основу для нашей беседы и определимся с терминологией.
Основным элементом панели задач является кнопка панели задач. Кнопка представлена иконкой на панели задач. Как видите, на панели задач размещается масса кнопок, статус которых можно понять, лишь взглянув на них:
Возьмем, к примеру, кнопку Windows Media Player: она не обрамлена и ничем не выделяется. Это свидетельствует о том, что Windows Media Player не запущен. Однако, приложение закреплено на панели задач и будет оставаться там, если мы не уберем его. Вокруг иконки Windows Explorer можно видеть тусклую рамку: это свидетельствует о том, что приложение работает, но не активно. У Visual Studio иконка в более непрозрачной прямоугольной рамке, указывающей на то, что в данный момент пользователь работает с этим приложением. Обратите внимание, что в Word открыто много документов и они сгруппированы в одну иконку приложения. Очень важно понимать логику создания и группировки окон приложений на панели задач.
Существенное количество приложений, работающих в Windows 7 (например, Office Word 2007 и Visual Studio 2008), не были предназначены для работы с новой панелью задач Windows 7. Так каким же образом все они взаимодействуют с панелью задач и поддерживают списки переходов в Word? В основе лежит специальный Application ID, который автоматически присваивается запускаемым приложениям после их запуска. Каждое запускаемое приложение имеет свой AppID, присваиваемый либо самой Windows, либо приложением. Это не GUID, а простой строковый параметр, состоящий максимум из 128 символов. Все приложения и окна, имеющие одинаковый параметр AppID, включая списки переходов, группируются в одну кнопку на панели задач. Важно понимать, что каждый компонент (процесс, ярлык, окно, кнопка или документ) имеет ассоциированное с ним значение AppID.
Если вам интересны внутренние составляющие панели задач Windows 7, рекомендую вам посмотреть несколько видео: видео Роба Джэретта (Rob Jarrett) и Бена Бетса (Ben Bets) - За кулисами панели задач windows 7 и Обзор списков переходов .
Несмотря на то, что ОС может автоматически присвоить AppID, многие разработчики хотят иметь больший контроль над AppID для своего приложения или отдельного окна. Предположим, что у вас есть приложения, запускающие другие приложения (таким образом работает отладка с помощью Visual Studio). Или у вас есть несколько различных приложений и процессов, которые вы хотите сгруппировать под одной кнопкой панели задач. В любом случае, если вы пишете новое приложение для Windows 7, мы настоятельно рекомендуем задать свой собственный идентификатор приложения, согласно приведенной инструкции.
Теперь давайте перейдем к непосредственным тестам API, который позволяет контролировать ассоциации AppID для приложений.
Если необходимо задействовать отдельную кнопку для каждого процесса (включая все окна, принадлежащие этому процессу), вы можете присвоить AppID всему процессу, в котором исполняются все окна приложения без отдельных AppID. Присвоить отдельный AppID очень просто: осуществляется это с помощью функции SetCurrentProcessExplicitAppUserModelID :
где c_rgszAppID[0] - указатель на строку. Необходимо отметить, что в соответствии с документацией SDK этот метод должен быть применен в ходе загрузки приложения перед появлением его интерфейса или манипуляций со списками переходов.
В управляемом коде из последней версии API-библиотек вы можете использовать свойство AppID как часть объекта Taskbar, который можно найти в пространстве имен Microsoft.WindowsAPICodePack.Shell.Taskbar. Используя это свойство, можно присваивать AppID.
Присвоить AppID отдельному окну чуть сложнее. Выполняется это вызовом функции SHGetPropertyStoreForWindow и дальнейшей манипуляцией с объектом IPropertyStore для получения необходимого свойства:
В приведенном фрагменте можно видеть, как извлекаются свойство окна вызовом SHGetPropertyStoreForWindow, передачей hWnd в качестве ссылки на окно. Затем инициируем с помощью InitPropVariantFromString(c_rgszAppID[iAppID], &pv) вариант свойства строкой, представляющей AppID для конкретного окна. И, наконец, устанавливаем значение нового свойства для окна.
К сожалению, нынешний Windows API Code Pack не поддерживает установку AppID для отдельных окон, хотя все, что вам нужно сделать, - это добавить следующую функцию в файл Taskbar.cs:
Поскольку в Windows API Code Pack присутствует исходный код, вы можете посмотреть на реализацию функции SetWindowAppId и увидеть собственными глазами, что она очень похожа на пример SetAppID, приведенный выше. Обратите внимание, что вовсе не обязательно использовать полное имя сборки "Microsoft.WindowsAPICodePack.Shell" - я использовал его, чтобы объяснить иерархию Windows API Code Pack.
Кстати, идентификатор окна AppID динамичен, так что вполне возможно чтобы окно отображалось как одна кнопка панели задач, а затем изменив его AppID, заставить появиться на совершенно другой кнопке. Это имеет интересный эффект. Допустим, список перехода прикреплен к кнопке на панели задач (с конкретным AppID), поэтому одно и то же окно может отображать разные списки перехода при прикреплении к другим кнопкам панели задач. Это может ввести пользователей в заблуждение, поэтому мы рекомендуем установить окну определенный AppID и придерживаться его, используя тот же процесс для определения AppID при каждом отображении окна.
Вы можете найти управляемый код объекта Taskbar в проекте Windows API Code Pack .
Сегодня я расскажу, как группировать несколько программ, разработчиком которых являетесь Вы, под один значок ярлыка в панели задач.
Метод работает для систем на базе ОС Windows 7/8/8.1/10.
Начиная с Windows 7, в систему введено понятие идентификатора AppUserModelID. Далее, я буду его называть коротко – AppID.
Он представляет из себя строку до 128 символов максимум в формате CompanyName.ProductName.SubProduct.VersionInformation. Этот формат является рекомендованным, но не обязательным.
AppID может быть назначен:
– процессу;
– окну приложения;
– ярлыку LNK.
Сразу скажу: чтобы сгруппировать все приложения под один значок, Вы должны назначить этим процессам и ярлыку, закрепленному на панели задач, одинаковый AppID.
Это также повлияет на:
– порядок поиска ярлыка панели задач для приложения (если бинарный файл был перемещен, то закрепленный значок все равно будет найден при запуске приложения);
– скорость инициализации приложения;
– видимость ярлыков в меню ПУСК. Если Ваши ярлыки ведут к одному приложению и различаются только аргументами, то без AppID, в меню ПУСК будет виден только 1 ярлык, остальные – скрыты (актуально дли систем на базе ОС Windows 8/8.1/10)
Группировка нескольких программ под один значок может потребоваться по разным причинам. Например, Вы разрабатываете какое-нибудь хост-приложение, где порождается несколько дочерних процессов. При этом, данные процессы Вы не хотите скрывать, но и отображать миллион значков в панели задач для Вас тоже неприемлемо.
Рассмотрим как это сделать подробнее на примере браузера от Майкрософт – Project Spartan…
Бинарная структура предустановленного ярлыка Microsoft.Spartan.Spartan.lnk выглядит следующим образом:
Она показывает, что к LNK присоединен в качестве метаданных AppID приложения ProjectSpartan:
Microsoft.Windows.Spartan_cw5n1h2txyewy!Microsoft.Spartan.Spartan
(значение может изменяться от версии к версии).
Вы можете сделать тоже самое:
а) через инсталлятор приложения. Например, в AdminStudio через вкладу«Shell Properties»:
б) модифицировав готовый ярлык, используя библиотеку shell32.dll:
1) Сперва следует загрузить ярлык с помощью метода Load интерфейса IPersistFile, унаследованного от IShellLink.
2) Затем записать соответствующие метаданные с помощью интерфейса IPropertyStore, указав в качестве идентификатора GUID AppUserModel_ID –
в) Есть и неординарный способ (чисто ради эксперимента). Если Вашему процессу назначен AppID, после его запуска выберите из контекстного меню иконки в панели задач пункт «Закрепить программу в панели задач». Это создаст ярлык уже с метаданными.
Итак, записывать AppUserModelID в ярлык мы научились.
Часть 2. Для успеха нам требуется записать такой же AppID в само приложение.
Она принимает указатель на строку с AppUserModelID.
Эту функцию следует разместить перед прорисовкой формы приложения, т.е. в идеале – на этапе инициализации. Таким образом, мы явно назначаем AppID (он будет называться explicit AppUserModelID).
Если этого не сделать, ОС сама назначит приложению AppID, рассчитанный на основе специфических алгоритмов, на что будет потрачено некоторое время. Такой AppID будет называться неявным (implicit AppUserModelID).
Тест возможностей
Для демонстрации, я возьму 2 независимые программы, написанные на VB6:
– HiJackThis by Trend Micro
– ClearLNK by Alex Dragokas
Мне будет проще показать это на видео:
Как узнать AppID ?
Нет документированного способа узнать AppID чужого приложения, разве что внедриться в него и вызвать функцию GetCurrentProcessExplicitAppUserModelID (при этом AppID, заданный неявно (implicit), она все равно не покажет).
Однако, ОС умеет это делать иным способом. И если покопаться глубже, то вполне возможно, что Вам повезет
Я же только расскажу, где его можно посмотреть:
1) Нажимаем комбинацию клавиш Win + R, вводим: shell:AppsFolder
2) Откроется окно с установленными программами и компонентами.
3) В правом углу выберите режим преставления – табличный.
Нажмите левый ALT, появится меню, выберите View -> Choose Details…, поставьте галочку на пункте «AppUserModelID», ОК.
Кстати, запустить любое приложение из этого меню, используя его AppID, можно таким образом:
Уточню, что этим способом можно запустить только установленное приложение или компонент системы.
Зачем еще используется AppID ?
1) Jump List.
Зная AppID, Вы можете получить доступ к списку переходов (Jump list), например, для перечисления списка недавно открытых файлов в какой-нибудь программе.
2) Запуск приложения без указания полного пути.
Microsoft в новых ОС использует AppID, чтобы идентифицировать приложение.
Например, если Вы посмотрите на листинг структуры ярлыка Spartan, выложенный ранее, то не увидите прямых путей (разве что путь к каталогу).
AppID связан с Application Class примерно так:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d]
[HKEY_CLASSES_ROOT\AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d\Shell\Open]
"ActivatableClassId"="Microsoft.Spartan.Spartan.AppXg7kxxh26qff97eq30vmjc45gmf279j0y.mca"
"ContractId"="Windows.File"
"PackageId"="Microsoft.Windows.Spartan_0.11.10074.0_neutral_neutral_cw5n1h2txyewy"
"DesiredInitialViewState"=dword:00000000
Соответственно, в Windows 10 (как в 8/8.1 не проверял), некоторым ассоциациям файлов также назначены Application Class вместо полного пути к приложению.
Эти 10016 событий записываются, когда компоненты Microsoft пытаются получить доступ к компонентам DCOM без необходимых разрешений. Эти события обычно можно безопасно игнорировать, потому что они не влияют отрицательно на функциональность и являются преднамеренными.
Параметры разрешений для конкретного приложения не предоставляют разрешение локальной активации для приложения COM-сервера с CLSID и APPID пользователю NT AUTHORITY LOCAL SERVICE SID (S-1-5-19) с адреса LocalHost (с использованием LRPC), запущенного в контейнере приложения. Недоступный SID (недоступен). Это разрешение безопасности можно изменить с помощью инструмента администрирования служб компонентов.
Параметры разрешений для конкретного приложения не предоставляют локальную активацию
- Определите и подтвердите CLSID и APPID
- Измените владельца ключа CLSID из редактора реестра
- Изменить разрешение безопасности из служб компонентов
Прочтите, чтобы узнать подробности о шагах.
Затем щелкните значок Передовой кнопка.
По умолчанию этот ключ принадлежит TrustedInstaller, но вам нужно изменить владельца на администратора. Для этого нажмите кнопку Изменять кнопка в Расширенные настройки безопасности окно> напишите «Администратор»> щелкните Проверить имена кнопку> щелкните Ok кнопка.
Также вам нужно выбрать Заменить владельца подконтейнеров и объектов флажок.
После этого выберите Администраторы от Группы или имена пользователей список и отметьте Разрешить / Полный доступ флажок. Теперь сохраните ваши настройки.
Вам нужно сделать то же самое, что и выше, чтобы изменить владельца этого ключа реестра.
Если у вас возникла проблема с изменением владельца ключа реестра, вы можете воспользоваться нашим бесплатным инструментом RegOwnit, который позволяет сделать это одним щелчком мыши.
Далее перейдите к Безопасность таб. Здесь можно найти три метки, в том числе Разрешения на запуск и активацию. Щелкните соответствующий Редактировать кнопка.
После добавления выбирайте по одному и дайте Локальный запуск и Локальная активация разрешения для них обоих.
Сохраните изменения, вы больше не получите ту же проблему в средстве просмотра событий.
Независимо от того, возникла ли у вас проблема с RuntimeBroker, Immersive Shell или любым другим процессом, решение будет одинаковым для всех.
Просмотр приложений, которые используют идентификатор Apple ID
На iPhone, iPad или iPod touch
- Откройте приложение «Настройки», затем выберите ваше имя.
- Нажмите «Пароль и безопасность».
- Нажмите «Приложения, использующие идентификатор Apple ID».
На компьютере Mac
На веб-сайте
Управление приложениями
Если вы скрыли адрес электронной почты от приложения и используете службу ретрансляции, можно отключить перенаправление электронной почты на ваш личный электронный адрес. Также можно прекратить использовать идентификатор Apple ID в данном приложении или на веб-сайте.
Отключение перенаправления электронной почты
Чтобы электронные письма, отправленные определенным разработчиком, не попадали в ваш личный почтовый ящик, отключите функцию «Переслать» и выберите «Остановить». Электронные письма не будут перенаправляться в ваш личный почтовый ящик, пока вы снова не включите пересылку электронной почты.
Изменение адреса электронной почты для пересылки
- На iPhone перейдите в меню «Настройки» и нажмите [ваше имя].
- Нажмите «Имя, номера телефонов, e-mail», затем нажмите «Переслать» под пунктом «Скрыть мой адрес e‑mail».
- Выберите адрес для переадресации электронных писем.
Выбранный адрес применяется для электронных писем, связанных со всеми приложениями и разработчиками, для которых вы используете функцию «Скрыть мой адрес e‑mail».
Прекращение использования идентификатора Apple ID в приложении
Чтобы прекратить использование идентификатора Apple ID в приложении, выберите «Остановить использование Apple ID», а затем нажмите «Остановить использование».
Для добавления новых приложений вам потребуется указать уникальный идентификатор приложения в магазине приложений (App Store или Google Play) в поле Bundle ID .
Узнать уникальный идентификатор iOS-приложения (Bundle ID или ID пакета) можно одним из двух способов:
Для собственных приложений:
Откройте iTunes Connect, перейдите к My Apps и выберите приложение, идентификатор которого хотите получить.
На странице приложения в выпадающем меню More выберите About this App .
Идентификатор приложения указан в поле Bundle ID .
Для любых приложений:
Скопируйте числовой идентификатор, который указан в URL между id и ? (в примере — 483693909 ).
В файле 1.txt, который браузер скачает по этому URL, найдите текст \"bundleId\" .
Идентификатор приложения Яндекс.Браузер для iPhone — ru.yandex.mobile.search .
Узнать уникальный идентификатор Android-приложения (имя пакета приложения или package name) можно одним из двух способов:
Для собственных приложений — откройте Консоль разработчика Google Play и выберите приложение, идентификатор которого хотите получить.
Идентификатор указан рядом с логотипом и названием приложения.
Идентификатор приложения Яндекс.Браузер для Android — com.yandex.browser .
","lang":>,"extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Получение идентификатора приложения (Bundle ID) - Рекламная сеть. Справка","productName":"Рекламная сеть","extra_js":[[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>,,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>]],"extra_css":[[],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>,,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"lang":"ru">>>'>"current":"ru","available":["en","ru"]>Для добавления новых приложений вам потребуется указать уникальный идентификатор приложения в магазине приложений (App Store или Google Play) в поле Bundle ID .
Узнать уникальный идентификатор iOS-приложения (Bundle ID или ID пакета) можно одним из двух способов:
Для собственных приложений:
Откройте iTunes Connect, перейдите к My Apps и выберите приложение, идентификатор которого хотите получить.
На странице приложения в выпадающем меню More выберите About this App .
Идентификатор приложения указан в поле Bundle ID .
Для любых приложений:
Скопируйте числовой идентификатор, который указан в URL между id и ? (в примере — 483693909 ).
В файле 1.txt, который браузер скачает по этому URL, найдите текст "bundleId" .
Идентификатор приложения Яндекс.Браузер для iPhone — ru.yandex.mobile.search .
Узнать уникальный идентификатор Android-приложения (имя пакета приложения или package name) можно одним из двух способов:
Для собственных приложений — откройте Консоль разработчика Google Play и выберите приложение, идентификатор которого хотите получить.
Читайте также: