Mimic Win 7 Favorites в Windows 10 (расширение пространства имен оболочки) - PullRequest
0 голосов
/ 30 октября 2018

Привет, дорогие друзья, stackoverflow

Несколько месяцев назад я задал вам вопрос о QuickAccess (Pin / Unpin) . К сожалению, мы все еще сталкиваемся с этой проблемой (Невозможно открепить виртуальные объекты). Несколько раз позвонив в службу поддержки Microsoft, они ответили нам, что мы должны подписаться на первичную поддержку ... Слишком дорого для небольшой компании.

Итак, мы решили имитировать избранное Windows 7 в нашем расширении пространства имен оболочки.

Ничего страшного в проводнике, вызов ShellExecuteEx с дескриптором представления, а абсолютный pidl целевого объекта lnk работает как шарм.

Слишком хорошо, чтобы быть правдой, да, поскольку это не работает, как ожидалось в IFileDialogs ... Во-первых, lnks (обернутый в виртуальный объект, но имя синтаксического анализа - «Путь к файловой системе») не был по понятным причинам показан в диалогах. Таким образом, мы попытались использовать такие атрибуты, как «SFGAO_FOLDER», «SFGAO_FILESYSANCESTOR» и т. Д., Но затем оболочка вызывала объект EnumObject объекта IShellFolder, а это не то, что нам нужно.

Итак, мы решили попробовать интерфейс IObjectWithSite, реализовав его в папке «Избранное». Затем мы смогли использовать события из IFileDialogs, такие как OnSelectionChange. Затем мы попробовали тот же метод, что и в проводнике, получая дескриптор представления (сначала запрашивая интерфейс IOleWindow, получая дескриптор окна, создавая представление в родительском IShellFolder с помощью дескриптора окна) и вызывая ShellExecuteEx ... И в результате получается ... Большое приложение (Блокнот , Word и т. Д.) Сбой и новое окно проводника с выбранным правым виртуальным объектом.

Возможно, мой подход слишком сложен, у вас есть идеи?

Большое спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

Спасибо Саймону, я смог найти решение, все еще в работе. Проблема заключается в том, что в решении реализованы интерфейсы IContextMenu, IContextMenu2 и IContextMenu3. В Windows 7 был вызван обработчик меню .lnk, хорошо, в Windows 10, с другой стороны, нужно вызвать SHCreateDefaultContextMenu , затем объединить обработчики меню (SHCreateDefaultContextMenu вызовет IShellFolder :: GetUIObjectOf с IID_IQuery) , Так что код был датирован ... Спасибо!

...