Я могу получить интерфейс оболочки IShellView
, и я могу получить его контекстное меню, щелкнув правой кнопкой мыши по белой области просмотра папки (фон), следующий мой код:
...
IShellFolder* psf = NULL;
HRESULT hr = psfDesk->BindToObject(g_pidlSelectingFolder, NULL, IID_PPV_ARGS(&psf));
...
IShellView* pShellView = NULL;
if (FAILED(psfSelf->CreateViewObject(hParent, IID_PPV_ARGS(&pShellView))))
return;
IContextMenu3* pcm3 = NULL;
hr = pShellView->GetItemObject(SVGIO_BACKGROUND, IID_IContextMenu3, (LPVOID*)&pcm3);
HMENU hMenu = ::CreatePopupMenu();
pcm3->QueryContextMenu(g_hMenu, 0, 1, 10000, CMF_NORMAL);
POINT pt;
::GetCursorPos(&pt);
BOOL nCommandID = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTALIGN, pt.x, pt.y, 0, hParentWnd, NULL);
if (nCommandID == ...) ...
DestroyMenu(hMenu);
Оба следующих изображения - это мое контекстное меню и полное контекстное меню оболочки: http://jetyi.blog.sohu.com/album/photosetview-46937434-13489242.html
Вы видите, что 2end - это полное контекстное меню, а первое - мое получение контекстного меню по коду. Почему они разные, кто может решить эту проблему?
Для решения этой проблемы я отлаживаю оболочку с моим проектом расширения ярлыков, я нахожу полезную информацию. Ниже приведен код-1:
...
psf->GetUIObjectOf(hParentWnd, 1, (LPCITEMIDLIST*)&pdilChild, IID_IContextMenu, NULL, (LPVOID*)&pcm);
pcm->QueryInterface(IID_IContextMenu3, (LPVOID*)&pcm3);
pcm3->QueryContextMenu(hMenu, 0, 1, 50000, dwFlags);
...
Код-1 может получить полное контекстное меню (3-е изображение) пользователя, выбирающего элемент в папке, указанной "psf" (IShellFolder *). Моя статистика VS2008 показывает данные:
ShortcutMenuShellEx.dll!CShellExInit::Initialize(...)
shell32.dll!_HDXA_AppendMenuItems2@36() - 0x14b bytes
shell32.dll!CDefFolderMenu::QueryContextMenu() + 0x2c1 bytes
shell32.dll!CContextMenuOnContextMenuArray::QueryContextMenu() + 0x7d bytes
shell32.dll!CDefView::_DoContextMenuPopup() + 0xfb bytes
shell32.dll!CDefView::ContextMenu() + 0x1e4 bytes
shell32.dll!CDefView::WndProc() + 0xf2bc bytes
shell32.dll!CDefView::s_WndProc() + 0x56 bytes
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
...
Но, используя код имени:
...
pShellView->GetItemObject(SVGIO_BACKGROUND, IID_IContextMenu3, (LPVOID*)&pcm3);
...
Получает короткое контекстное меню (первое изображение). Мой стек VS2008 показывает эти данные:
ShortcutMenuShellEx.dll!CShellExInit::Initialize(...)
shell32.dll!_HDXA_AppendMenuItems2@36() - 0x14b bytes
shell32.dll!CDefFolderMenu::QueryContextMenu() + 0x2c1 bytes
shell32.dll!CContextMenuOnContextMenuArray::QueryContextMenu() + 0x7d bytes
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
...
Я не могу найти CDefView::xxx
, это вызвало проблему?
Вам нужно будет изучить следующий пример. Уверяю вас, очень сложно обвести голову, если вы не работаете с оболочкой все время.
Как разместить IContextMenu http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx