[EXPLORER][SHELL32] Forward Explorer refresh command to the Start Menu (#9108)

This commit is contained in:
Whindmar Saksit
2026-06-07 21:28:13 +02:00
committed by GitHub
parent e2d6e875f9
commit 3b58b347bc
8 changed files with 54 additions and 3 deletions

View File

@@ -41,6 +41,7 @@ UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
if (bRefresh)
{
FIXME("Refresh the Start menu with communicating with SHELL32\n");
// TODO: TRAYCMD_RELOAD_STARTMENUCFG
}
return hRet;

View File

@@ -9,6 +9,7 @@
#include "precomp.h"
#include <commoncontrols.h>
#include <cfgmgr32.h>
#include <regstr.h>
#include "appbar.h"
HRESULT TrayWindowCtxMenuCreator(ITrayWindow * TrayWnd, IN HWND hWndOwner, IContextMenu ** ppCtxMenu);
@@ -458,11 +459,22 @@ public:
ClearRecentAndMru();
}
void RefreshStartMenuSettings()
{
IUnknown_Exec(m_StartMenuPopup, CLSID_MenuBand, 0x10000000, 0, NULL, NULL);
}
LRESULT DoExitWindows()
{
if (SHRestricted(REST_NOCLOSE))
return 0;
if (GetAsyncKeyState(VK_SHIFT) < 0 ||
!SHGetValueW(HKEY_CURRENT_USER, REGSTR_PATH_EXPLORER L"\\Advanced", L"StartMenuForceRefresh", NULL, NULL, NULL))
{
RefreshStartMenuSettings();
}
SaveState();
/* Display the ReactOS Shutdown Dialog */
@@ -881,13 +893,23 @@ public:
Sleep(100);
//DisconnectWindowsDialog(m_DesktopWnd); // FIXME: shell32
break;
case TRAYCMD_RELOAD_STARTMENUCFG:
C_ASSERT(TRAYCMD_RELOAD_STARTMENUCFG == FCIDM_SHBROWSER_REFRESH);
C_ASSERT(TRAYCMD_RELOAD_STARTMENUCFG != FCIDM_CABINET_REFRESH);
C_ASSERT(TRAYCMD_RELOAD_STARTMENUCFG != TRAYCMD_REFRESH_MENU);
RefreshStartMenuSettings();
break;
case IDM_SEARCH:
case TRAYCMD_SEARCH_FILES:
C_ASSERT(TRAYCMD_SEARCH_FILES == FCIDM_SHBROWSER_FINDFILES);
SHFindFiles(NULL, NULL);
break;
case TRAYCMD_SEARCH_COMPUTERS:
C_ASSERT(TRAYCMD_SEARCH_COMPUTERS == FCIDM_SHBROWSER_FINDCOMPUTER);
SHFindComputer(NULL, NULL);
break;
//case TRAYCMD_REFRESH_MENU: Does nothing on WinXP+
// break;
default:
break;
}
@@ -2488,6 +2510,7 @@ ChangePos:
#else
// Update the start menu
UpdateStartMenu(m_StartMenuPopup, hbmBanner, g_TaskbarSettings.sr.SmSmallIcons, TRUE);
HandleCommand(TRAYCMD_RELOAD_STARTMENUCFG);
#endif
}

View File

@@ -258,6 +258,9 @@ HRESULT STDMETHODCALLTYPE CShellDispatch::FindComputer()
HRESULT STDMETHODCALLTYPE CShellDispatch::RefreshMenu()
{
TRACE("(%p)\n", this);
C_ASSERT(FCIDM_CABINET_REFRESH == TRAYCMD_REFRESH_MENU);
// According to https://learn.microsoft.com/en-us/windows/win32/shell/ishelldispatch-refreshmenu
// only systems preceding Windows XP refreshes the contents of the Start menu when this is called.
return PostTrayCommand(TRAYCMD_REFRESH_MENU);
}

View File

@@ -1172,6 +1172,8 @@ HRESULT CMenuBand::AdjustForTheme(BOOL bFlatStyle)
HRESULT STDMETHODCALLTYPE CMenuBand::InvalidateItem(LPSMDATA psmd, DWORD dwFlags)
{
UNIMPLEMENTED;
if (!psmd && (dwFlags & SMINV_REFRESH))
_CallCB(SMC_REFRESH, 0, 0);
return S_OK;
}

View File

@@ -125,9 +125,22 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::Exec(const GUID *pguidCmdGroup, DWORD nC
return _AdjustForTheme(nCmdexecopt);
}
}
if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
else if (IsEqualIID(*pguidCmdGroup, CLSID_MenuBand))
{
switch (nCmdID)
{
case 0x10000000: // refresh (sent from TRAYCMD_RELOAD_STARTMENUCFG)
{
CComPtr<IShellMenu2> pSM; // We just want IShellMenu but CMenuBand::QI is broken?
if (SUCCEEDED(IUnknown_QueryService(m_Client, SID_SMenuBandBottom, IID_PPV_ARG(IShellMenu2, &pSM))))
pSM->InvalidateItem(NULL, SMINV_REFRESH);
return S_OK;
}
}
}
/*else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
{
}*/
else if (IsEqualIID(*pguidCmdGroup, IID_IDeskBarClient))
{
switch (nCmdID)

View File

@@ -25,7 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(CStartMenu);
//#define TEST_TRACKPOPUPMENU_SUBMENUS
#define IDM_STARTMENUROOT ( (UINT)-1 )
/* NOTE: The following constants *MUST NOT* be changed because
they're hardcoded and need to be the exact values
in order to get the start menu to work! */
@@ -474,6 +474,13 @@ public:
case SMC_SFEXEC:
m_pTrayPriv->Execute(psmd->psf, psmd->pidlItem);
break;
case SMC_REFRESH:
if (psmd->uIdParent == IDM_STARTMENUROOT)
{
// TODO: Update CascadeMyDocuments etc.
return S_OK;
}
break;
case 0x10000000: // _FilterPIDL from CMenuSFToolbar
if (psmd->psf->CompareIDs(0, psmd->pidlItem, m_pidlPrograms) == 0)
return S_OK;
@@ -619,7 +626,7 @@ RSHELL_CStartMenu_CreateInstance(REFIID riid, void **ppv)
pCallback->AddRef(); // CreateInstance returns object with 0 ref count */
pCallback->Initialize(pShellMenu, pBandSite, pDeskBar);
hr = pShellMenu->Initialize(pCallback, (UINT) -1, 0, SMINIT_TOPLEVEL | SMINIT_VERTICAL);
hr = pShellMenu->Initialize(pCallback, IDM_STARTMENUROOT, 0, SMINIT_TOPLEVEL | SMINIT_VERTICAL);
if (FAILED_UNEXPECTEDLY(hr))
return hr;

View File

@@ -94,6 +94,7 @@ struct persistState
#define FCIDM_SHBROWSER_MAPNETDRIVE 0xA081
#define FCIDM_SHBROWSER_UNMAPNETDRIVE 0xA082
#define FCIDM_SHBROWSER_FINDFILES 0xA085
#define FCIDM_SHBROWSER_FINDCOMPUTER 0xA086
#define FCIDM_SHBROWSER_OPTIONS 0xA123
#define FCIDM_CABINET_NT5_GOTO_DRIVES 0xA132
#define FCIDM_CABINET_TOGGLEITBAR 0xA201

View File

@@ -1015,6 +1015,7 @@ BOOL WINAPI LinkWindow_UnregisterClass(_In_ DWORD dwUnused);
#define TRAYCMD_PRINTERS_AND_FAXES 510
#define TRAYCMD_LOCK_DESKTOP 517
#define TRAYCMD_SWITCH_USER_DIALOG 5000
#define TRAYCMD_RELOAD_STARTMENUCFG 41061
#define TRAYCMD_SEARCH_FILES 41093
#define TRAYCMD_SEARCH_COMPUTERS 41094
#define TRAYCMD_REFRESH_MENU 41504