Я звоню IContextMenu::QueryContextMenu
с CMF_CANRENAME
, и у меня возникают проблемы с обработкой операции переименования при вызове IContextMenu::InvokeCommand
в Windows XP.Как вы обрабатываете операции переименования при вызове IContextMenu?
Я не расширение пространства имен, и я не использую DefView/IShellView, но я предоставляю сайт, который реализует IServiceProvider
.
В новых версиях Windows я запрашиваю для службы, которая реализует IFolderView2 и вызовы оболочки IFolderView2::DoRename
, и я могу запустить операцию переименования.
В Windows XP он запрашивает службу SID_DefView
, но я не могу найти никакой информации о том, как я должен реализовывать эту службу.
Интерфейс он (Shell32 CDefFolderMenu! :: _ ProcessRename) просит есть {985F64F0-D410-4E02-BE22-DA07F2B5C5E1} и я могу видеть в реестре, что это IID для IDefViewFrame3
, но это, кажется, без документов ! IDefViewFrame, с другой стороны, задокументирован, но единственное, что говорит MSDN, - «Используется только для его функций IUnknown, у него нет собственных методов».
Есть ли документированный способ обработки операций переименования на XP в этой ситуации?
Я действительно не хочу подделывать интерфейс IDefViewFrame3, но единственный вариант, о котором я могу думать, это посмотреть, является ли он переименованным глаголом и просто обрабатывать его сам после TrackPopupMenu
.
Рассмотрите, действительно ли вам нужно поддерживать XP. –
Если я правильно читаю ваш вопрос, некоторые другие фрагменты кода требуют, чтобы ваш код выполнял операцию переименования, и вы внутренне используете контекстное меню оболочки для выполнения фактического переименования. Это правильно? Вы спрашиваете, как реализовать 'IDefViewFrame3' для получения этого первоначального запроса на переименование? –
Для фактического переименования вам не нужно 'TrackPopupMenu()'. Вы просто «QueryContextMenu()», чтобы заполнить «HMENU» с помощью пунктов меню, затем найдите пункт меню «Переименовать» и передайте его идентификатор на 'InvokeCommand()'. Или просто пропустите 'QueryContextMenu()' и передайте жестко закодированное '' переименование ''глагола' InvokeCommand() '. –