简体   繁体   中英

How to obtain full shell context menu of right-click a folder background

I can obtain shell interface IShellView , and I can get its context menu of right click the folder view's white area (background), following is my code:

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

Both following images are my shortcut menu and the full shell context menu: http://jetyi.blog.sohu.com/album/photosetview-46937434-13489242.html

You see, the 2end one is full shortcut menu and the 1st one is my obtaining shortcut menu by the code. Why they are different, who can resolve this problem?

For resolve this problem, I debug the shell with my shortcut extension project, I find some useful information. Following is the code-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);
...

Code-1 can obtain a full context menu(the 3nd image) of user's selecting item in folder specified by 'psf'(IShellFolder*). My VS2008 statck show thes informations:

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

But, using the forename code:

...
pShellView->GetItemObject(SVGIO_BACKGROUND, IID_IContextMenu3, (LPVOID*)&pcm3);
...

It obtains the short context menu (the 1st image). My VS2008 stack shows these informations:

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

I can not find CDefView::xxx , is it that caused the problem?

You will need to study the following example. I assure you, it is extremely difficult to get your head around unless you work with the shell all the time.

How to host an IContextMenu http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM