2011-09-08 90 views
0

我可以获取shell界面IShellView,我可以右键单击它的上下文菜单右键单击文件夹视图的白色区域(背景),以下是我的代码:如何获取完整的shell右键菜单右键单击文件夹背景

... 
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是由代码我得到快捷菜单。他们为什么不同,谁能解决这个问题?

为了解决这个问题,我调试了我的快捷方式扩展项目的shell,我找到了一些有用的信息。以下是代码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可以获取用户的选择项的完整的上下文菜单(3ND图像)由“PSF”(的IShellFolder *)指定的文件夹。 我VS2008 statck显示THES信息:

ShortcutMenuShellEx.dll!CShellExInit::Initialize(...) 
[email protected]() - 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 
[email protected]() + 0x28 bytes 
... 

但是,使用通信录名字代码:

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

它获得短期上下文菜单(第1图像)。 我VS2008堆栈显示这些信息:

ShortcutMenuShellEx.dll!CShellExInit::Initialize(...) 
[email protected]() - 0x14b bytes 
shell32.dll!CDefFolderMenu::QueryContextMenu() + 0x2c1 bytes 
shell32.dll!CContextMenuOnContextMenuArray::QueryContextMenu() + 0x7d bytes  
[email protected]() + 0x28 bytes 
... 

我找不到CDefView::xxx,是导致该问题?

+0

代码的格式是一个烂摊子,请修复 –

回答