c ++ - Sådan får du fuldskalens kontekstmenu ved at højreklikke på en mappe baggrund

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kan hente shell-grænsefladen IShellView, og jeg kan få sin kontekstmenu til at højreklikke på mappevisningen s hvide område (baggrund), følgende er min kode:


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


Begge følgende billeder er min genvejsmenu og fuldskalens kontekstmenu:
http://jetyi.blog.sohu.com/album/photosetview-46937434-13489242.html[8]


Du ser, den 2end er en fuld genvejsmenu, og den første er min hentende genvej menu ved koden. Hvorfor er de forskellige, hvem kan løse dette problem?


For at løse dette problem, fejler jeg skalen med mit genvejsprojekt, jeg finder nogle nyttige oplysninger. Følgende er koden-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);
...


Kode 1 kan få en fuld kontekstmenu (det tredje billede) af brugerens valgmulighed i mappen specificeret af 'psf' (IShellFolder *).
Min VS2008 statck viser disse informationer:


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


Men ved at bruge fornavnskoden:


...
pShellView->GetItemObject(SVGIO\_BACKGROUND, IID\_IContextMenu3, (LPVOID*)&pcm3);
...


Den får den korte kontekstmenu (det første billede).
Min VS2008-stak viser disse oplysninger:


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


Jeg kan ikke finde CDefView::xxx, er det der forårsagede problemet?

Bedste reference


Du bliver nødt til at studere følgende eksempel. Jeg forsikrer dig, det er ekstremt svært at få hovedet rundt, medmindre du arbejder hele tiden med skallen.


Sådan hoster du en IContextMenu
http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx[9]