я могу установить AppUserModelID произвольного процесса, запущенного через список переходов? - PullRequest
1 голос
/ 17 января 2011

У меня есть простое консольное приложение, написанное на C ++, которое действует как заглушка для запуска другого приложения через его список переходов.Цель состоит в том, чтобы добавить возможности списка переходов в приложения, которые не поддерживают это.Назовите это stub.exe.При запуске stub.exe он создает настраиваемый список переходов, используя следующие шаги (взятые правильно из примеров MS):

create an ICustomDestinationList
ICustomDestinationList::BeginList()
create an IObjectCollection
for_each item_to_add
  create an IShellLink, set its path/arguments/title/icon
  add IShellLink to the IObjectCollection
get the IObjectArray interface from the IObjectCollection
call ICustomDestinationList::AddUserTasks( IObjectArray interface )
ICustomDestinationList::CommitList()

При закреплении stub.exe на панели задач и щелчке правой кнопкой мыши на нем появляется Jumpilst, и онсодержит все добавленные IShellLinks.При нажатии на элемент он запускает соответствующий процесс.

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

  • только для тестирования, создайте пару ярлыков и установите идентификатор через IPropertyStore-> SetValue (PKEY_AppUserModel_ID, «id»).Действительно, при запуске этих ярлыков все они будут группироваться под одним значком на панели задач.
  • , поскольку ярлыки делают то, что я хочу, я попытался добавить ярлыки в список переходов stub.exe: безрезультатно.Ярлыки даже не отображаются в списке переходов (может быть, у него нет ярлыка для ярлыка?), Но все методы возвращают S_OK
  • , устанавливая PKEY_AppUserModel_ID для каждого из IShellLink, которые добавляются в список переходов:без эффекта
  • вызов ICustomDestinationList-> SetAppID (): без эффекта
  • вместо использования подзадач, пробовал с SHAddToRecentDocs: без эффекта.Список последних документов не отображается.Но сейчас все становится грязно.После установки AppUserModelID для ярлыка, который отвечает за закрепленный элемент панели задач (тот, что находится в% APPDATA% / Роуминг / Microsoft / Internet Explorer / Быстрый запуск / Пользователь закреплен / TaskBar), список переходов изменился: он не отображает «Задачи»'item больше, но показывает' Recent 'и элементы, которые я добавил с помощью SHAddToRecentDocs.Теперь, нажимая на них, я получаю диалоговое окно с заголовком, который начинается с «d: \ desktop», за которым следуют китайские иероглифы.При наведении курсора на элементы списка переходов вместо заданного мною описания также отображаются китайские иероглифы.

Вопросы:

  1. Что с китайскими символами в списке переходов?
  2. Почему установка идентификатора приложения на панели задач позволяет переключаться между разделами «Задачи» и «Последние», почему их там нет?
  3. Каким образом, если вообще возможно, добиться того, чтона самом деле хотите: пользовательский список переходов, из которого запускаемые элементы будут группироваться под значком на панели задач?(обратите внимание, что процессам, которые я планирую запустить, в настоящее время не установлен идентификатор приложения)

1 Ответ

1 голос
/ 29 января 2011

здесь не так много реакций;]

Тем временем мне удалось решить основную проблему самостоятельно; Это не совсем простое решение, но оно полностью удовлетворяет требованиям: программа запускается в фоновом режиме и устанавливает ловушку CBT. Каждый раз, когда приложение создает окно (HookProc code = HCBT_CREATEWND), ловушка проверяет путь приложения по карте, содержащей пути и желаемые идентификаторы приложения. Если совпадение найдено, то устанавливается идентификатор приложения HWND. Поскольку это происходит до того, как окно действительно отображается и объединяется со списком пользовательских задач, с точки зрения пользователя приложение ведет себя так же, как и приложение, которое поддерживает список недавних / закрепленных документов.

...