return (int)(short)LOWORD(hr);
}
+static BOOL IsPidlPrograms(LPCITEMIDLIST pidlTarget)
+{
+ WCHAR szTarget[MAX_PATH], szPath[MAX_PATH];
+ if (!SHGetPathFromIDListW(pidlTarget, szTarget))
+ return FALSE;
+ SHGetSpecialFolderPathW(NULL, szPath, CSIDL_COMMON_PROGRAMS, FALSE);
+ if (lstrcmpiW(szTarget, szPath) == 0)
+ return TRUE;
+ SHGetSpecialFolderPathW(NULL, szPath, CSIDL_PROGRAMS, FALSE);
+ return (lstrcmpiW(szTarget, szPath) == 0);
+}
+
HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
{
HRESULT hr;
DPA_Sort(dpaSort, PidlListSort, (LPARAM) m_shellFolder.p);
- for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
- {
- PWSTR MenuString;
+ BOOL StartMenuAdminTools = SHRegGetBoolUSValueW(
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
+ L"StartMenuAdminTools", FALSE, TRUE);
- INT index = 0;
- INT indexOpen = 0;
+ BOOL bMustHideAdminTools = IsPidlPrograms(m_idList) && StartMenuAdminTools;
+ TRACE("StartMenuAdminTools: %d\n", StartMenuAdminTools);
+ TRACE("bMustHideAdminTools: %d\n", bMustHideAdminTools);
- STRRET sr = { STRRET_CSTR, { 0 } };
+ WCHAR szAdminTools[MAX_PATH];
+ if (bMustHideAdminTools)
+ {
+ LoadStringW(GetModuleHandleW(L"shell32.dll"), IDS_ADMINISTRATIVETOOLS,
+ szAdminTools, _countof(szAdminTools));
+ }
+ for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
+ {
item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);
+ STRRET sr = { STRRET_CSTR };
hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
if (FAILED_UNEXPECTEDLY(hr))
{
return hr;
}
+ PWSTR MenuString;
StrRetToStr(&sr, NULL, &MenuString);
- index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
+ if (bMustHideAdminTools && lstrcmpiW(MenuString, szAdminTools) == 0)
+ {
+ ++i;
+ CoTaskMemFree(MenuString);
+ continue;
+ }
+
+ INT indexOpen = 0;
+ INT index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
LPCITEMIDLIST itemc = item;
AddOrSetMenuItem(hMenu, IDM_PRINTERSANDFAXES, CSIDL_PRINTERS, bExpand, FALSE, FALSE);
}
- HRESULT AddStartMenuItems(IShellMenu *pShellMenu, INT csidl, DWORD dwFlags)
+ HRESULT AddStartMenuItems(IShellMenu *pShellMenu, INT csidl, DWORD dwFlags, IShellFolder *psf = NULL)
{
- CComHeapPtr<ITEMIDLIST> pidlMenu;
+ CComHeapPtr<ITEMIDLIST> pidlFolder;
CComPtr<IShellFolder> psfDesktop;
CComPtr<IShellFolder> pShellFolder;
HRESULT hr;
- hr = SHGetFolderLocation(NULL, csidl, 0, 0, &pidlMenu);
+ hr = SHGetFolderLocation(NULL, csidl, 0, 0, &pidlFolder);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
- hr = SHGetDesktopFolder(&psfDesktop);
- if (FAILED_UNEXPECTEDLY(hr))
- return hr;
+ if (psf)
+ {
+ pShellFolder = psf;
+ }
+ else
+ {
+ hr = SHGetDesktopFolder(&psfDesktop);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
- hr = psfDesktop->BindToObject(pidlMenu, NULL, IID_PPV_ARG(IShellFolder, &pShellFolder));
- if (FAILED_UNEXPECTEDLY(hr))
- return hr;
+ hr = psfDesktop->BindToObject(pidlFolder, NULL, IID_PPV_ARG(IShellFolder, &pShellFolder));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+ }
- hr = pShellMenu->SetShellFolder(pShellFolder, NULL, NULL, dwFlags);
+ hr = pShellMenu->SetShellFolder(pShellFolder, pidlFolder, NULL, dwFlags);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
{
case IDM_PROGRAMS:
{
- if (m_psfPrograms)
- hr = pShellMenu->SetShellFolder(m_psfPrograms, NULL, NULL, SMSET_TOP);
+ hr = AddStartMenuItems(pShellMenu, CSIDL_PROGRAMS, SMSET_TOP, m_psfPrograms);
break;
}
case IDM_FAVORITES: