Как получить полное контекстное меню оболочки правой кнопкой мыши на фоне папки - PullRequest
0 голосов
/ 08 сентября 2011

Я могу получить интерфейс оболочки 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

Видите ли, 2-е - это полное контекстное меню, а 1-е - это мое контекстное меню, полученное с помощью кода. Почему они разные, кто может решить эту проблему?

Для решения этой проблемы я отлаживаю оболочку с помощью своего проекта расширения ярлыка, нахожу некоторую полезную информацию. Ниже приведен код-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 statck показывает информацию:

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);
...

Получает короткое контекстное меню (1-е изображение). Мой стек 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, это вызвало проблему?

1 Ответ

0 голосов
/ 12 ноября 2011

Вам нужно будет изучить следующий пример.Уверяю вас, чрезвычайно сложно разобраться, если вы не работаете с оболочкой все время.

Как разместить IContextMenu http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...