mirror of
https://github.com/reactos/reactos.git
synced 2025-06-12 08:18:31 +00:00
[SHDOCVW] Don't show create shortcut context menu item in Explorer tree (#7735)
This commit is contained in:
parent
4a0f0ddbd7
commit
fc6330a01a
3 changed files with 52 additions and 3 deletions
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue