开发者

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_I开发者_开发百科ContextMenu3, (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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜