[英]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: 我可以获得外壳程序接口
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);
Both following images are my shortcut menu and the full shell context menu: http://jetyi.blog.sohu.com/album/photosetview-46937434-13489242.html 以下两个图像是我的快捷菜单和完整的外壳上下文菜单: 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. 您会看到,第2个是完整的快捷菜单,第一个是我通过代码获取的快捷菜单。 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:
以下是代码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*). 代码1可以在“ psf”(IShellFolder *)指定的文件夹中获得用户选择项的完整上下文菜单(第三个图像)。 My VS2008 statck show thes informations:
我的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
...
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:
我的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
...
I can not find CDefView::xxx
, is it that caused the problem? 我找不到
CDefView::xxx
,是引起问题的原因吗?
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.
我向您保证,除非您一直使用shell,否则很难动手。
How to host an IContextMenu http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx 如何托管IContextMenu http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.