[SHDOCVW] Don't show create shortcut context menu item in Explorer tree (#7735)

This commit is contained in:
Whindmar Saksit 2025-03-05 13:41:02 +01:00 committed by GitHub
parent 4a0f0ddbd7
commit fc6330a01a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 52 additions and 3 deletions

View file

@ -992,6 +992,7 @@ LRESULT CNSCBand::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
hr = contextMenu->QueryContextMenu(menuTemp, 0, idCmdFirst, FCIDM_SHVIEWLAST, cmf);
if (FAILED_UNEXPECTEDLY(hr))
return 0;
SHELL_RemoveVerb(contextMenu, idCmdFirst, menuTemp, L"link");
enum { flags = TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON };
UINT uCommand = ::TrackPopupMenu(menuTemp, flags, pt.x, pt.y, 0, m_hWnd, NULL);

View file

@ -10,9 +10,25 @@
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
#ifndef SHCIDS_CANONICALONLY
#define SHCIDS_CANONICALONLY 0x10000000L
#endif
static inline INT_PTR
GetMenuItemIdByPos(HMENU hMenu, UINT Pos)
{
MENUITEMINFOW mii;
mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
mii.fMask = MIIM_ID; /* GetMenuItemID does not handle sub-menus, this does */
mii.cch = 0;
return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) ? mii.wID : -1;
}
static inline BOOL
IsMenuSeparator(HMENU hMenu, UINT Pos)
{
MENUITEMINFOW mii;
mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
mii.fMask = MIIM_FTYPE;
mii.cch = 0;
return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) && (mii.fType & MFT_SEPARATOR);
}
EXTERN_C HRESULT
SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
@ -71,6 +87,36 @@ SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
return FALSE;
}
static int
SHELL_FindVerbPos(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
{
for (UINT i = 0, c = GetMenuItemCount(hMenu); i < c; ++i)
{
INT_PTR id = GetMenuItemIdByPos(hMenu, i);
if (id != -1 && SHELL_IsVerb(pcm, id - idCmdFirst, Verb))
return i;
}
return -1;
}
EXTERN_C VOID
SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
{
int nPos = SHELL_FindVerbPos(pcm, idCmdFirst, hMenu, Verb);
if (nPos < 0)
return;
int nCount = GetMenuItemCount(hMenu);
BOOL bSepBefore = nPos && IsMenuSeparator(hMenu, nPos - 1);
BOOL bSepAfter = IsMenuSeparator(hMenu, nPos + 1);
if (DeleteMenu(hMenu, nPos, MF_BYPOSITION))
{
if ((bSepBefore && bSepAfter) || (bSepAfter && nPos == 0))
DeleteMenu(hMenu, nPos, MF_BYPOSITION);
else if (bSepBefore && nPos + 1 == nCount)
DeleteMenu(hMenu, nPos - 1, MF_BYPOSITION);
}
}
EXTERN_C BOOL
_ILIsDesktop(LPCITEMIDLIST pidl)
{

View file

@ -10,4 +10,6 @@
EXTERN_C HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl);
EXTERN_C BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b);
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb);
EXTERN_C VOID SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb);
EXTERN_C BOOL _ILIsDesktop(LPCITEMIDLIST pidl);