From 7c3d3851b8e4459bc7339f8d88342510b31efd9c Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Thu, 13 Jun 2024 13:11:34 +0200 Subject: [PATCH] [SHELL32] Respect menu Ctrl/Shift in CMenuBand and SHBrowseForFolder (#7015) --- dll/win32/shell32/brfolder.cpp | 8 +++++--- dll/win32/shell32/shellmenu/CMenuBand.cpp | 12 ++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/dll/win32/shell32/brfolder.cpp b/dll/win32/shell32/brfolder.cpp index 55b85ad90fe..81581626bac 100644 --- a/dll/win32/shell32/brfolder.cpp +++ b/dll/win32/shell32/brfolder.cpp @@ -911,8 +911,6 @@ BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam) enum { IDC_TOGGLE = 1, ID_FIRSTCMD, ID_LASTCMD = 0xffff }; HTREEITEM hSelected = TreeView_GetSelection(info.hwndTreeView); CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_PTINVOKE, info.hWnd }; - ici.fMask |= (GetKeyState(VK_SHIFT) < 0) ? CMIC_MASK_SHIFT_DOWN : 0; - ici.fMask |= (GetKeyState(VK_CONTROL) < 0) ? CMIC_MASK_CONTROL_DOWN : 0; ici.nShow = SW_SHOW; ici.ptInvoke.x = GET_X_LPARAM(lParam); ici.ptInvoke.y = GET_Y_LPARAM(lParam); @@ -946,7 +944,7 @@ BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam) if (!hMenu) return; info.pContextMenu = pcm; - UINT cmf = ((ici.fMask & CMIC_MASK_SHIFT_DOWN) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME; + UINT cmf = ((GetKeyState(VK_SHIFT) < 0) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME; hr = pcm->QueryContextMenu(hMenu, 0, ID_FIRSTCMD, ID_LASTCMD, CMF_NODEFAULT | cmf); if (hr > 0) _InsertMenuItemW(hMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, 0); @@ -968,6 +966,10 @@ BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam) } else if (cmd != 0) { + if (GetKeyState(VK_SHIFT) < 0) + ici.fMask |= CMIC_MASK_SHIFT_DOWN; + if (GetKeyState(VK_CONTROL) < 0) + ici.fMask |= CMIC_MASK_CONTROL_DOWN; pcm->InvokeCommand((CMINVOKECOMMANDINFO*)&ici); } info.pContextMenu = NULL; diff --git a/dll/win32/shell32/shellmenu/CMenuBand.cpp b/dll/win32/shell32/shellmenu/CMenuBand.cpp index bebdab2638f..486f745c6b0 100644 --- a/dll/win32/shell32/shellmenu/CMenuBand.cpp +++ b/dll/win32/shell32/shellmenu/CMenuBand.cpp @@ -832,8 +832,12 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y) return E_FAIL; TRACE("Before Query\n"); - const INT idCmdFirst = 100; - hr = contextMenu->QueryContextMenu(popup, 0, idCmdFirst, UINT_MAX, CMF_NORMAL); + UINT cmf = CMF_NORMAL; + if (GetKeyState(VK_SHIFT) < 0) + cmf |= CMF_EXTENDEDVERBS; + + const UINT idCmdFirst = 100, idCmdLast = 0xffff; + hr = contextMenu->QueryContextMenu(popup, 0, idCmdFirst, idCmdLast, cmf); if (FAILED_UNEXPECTEDLY(hr)) { TRACE("Query failed\n"); @@ -857,6 +861,10 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y) TRACE("Before InvokeCommand\n"); CMINVOKECOMMANDINFO cmi = { sizeof(cmi), 0, hwnd }; cmi.lpVerb = MAKEINTRESOURCEA(uCommand - idCmdFirst); + if (GetKeyState(VK_SHIFT) < 0) + cmi.fMask |= CMIC_MASK_SHIFT_DOWN; + if (GetKeyState(VK_CONTROL) < 0) + cmi.fMask |= CMIC_MASK_CONTROL_DOWN; hr = contextMenu->InvokeCommand(&cmi); TRACE("InvokeCommand returned hr=%08x\n", hr); }