From 5daab33c59f6b857aa0c3928722b0bb72b403f4f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 11 Mar 2024 10:54:12 +0900 Subject: [PATCH] [EXPLORER][SHELL32][SDK] Show/hide 'Run' menu item (#6592) Improve Start Menu customization. JIRA issue: CORE-16956 - Add SHSettingsChanged prototype to . - Add SetRestriction helper function. - Implement showing/hiding Run menu item of Start Menu. --- base/shell/explorer/precomp.h | 1 + base/shell/explorer/startmnucust.cpp | 15 ++++++++++++--- base/shell/explorer/startmnusite.cpp | 4 +--- base/shell/explorer/util.cpp | 9 +++++++++ dll/win32/shell32/dialogs/general.cpp | 3 --- sdk/include/reactos/undocshell.h | 6 +++--- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/base/shell/explorer/precomp.h b/base/shell/explorer/precomp.h index ad94ada234a..cc3f3d87561 100644 --- a/base/shell/explorer/precomp.h +++ b/base/shell/explorer/precomp.h @@ -110,6 +110,7 @@ BOOL GetRegValue(IN LPCWSTR pszSubKey, IN LPCWSTR pszValueName, IN BOOL bDefault BOOL SetRegDword(IN LPCWSTR pszSubKey, IN LPCWSTR pszValueName, IN DWORD dwValue); BOOL GetAdvancedBool(IN LPCWSTR pszValueName, IN BOOL bDefaultValue); BOOL SetAdvancedDword(IN LPCWSTR pszValueName, IN DWORD dwValue); +BOOL SetRestriction(IN LPCWSTR pszKey, IN LPCWSTR pszValueName, IN DWORD dwValue); /* * rshell.c diff --git a/base/shell/explorer/startmnucust.cpp b/base/shell/explorer/startmnucust.cpp index b4465de9722..e09b8ea32f1 100644 --- a/base/shell/explorer/startmnucust.cpp +++ b/base/shell/explorer/startmnucust.cpp @@ -96,6 +96,17 @@ static BOOL CALLBACK CustomizeWrite0(const CUSTOMIZE_ENTRY *entry, DWORD dwValue return SetAdvancedDword(entry->name, dwValue); } +static DWORD CALLBACK CustomizeReadRun(const CUSTOMIZE_ENTRY *entry) +{ + return !SHRestricted(REST_NORUN); +} + +static BOOL CALLBACK CustomizeWriteRest(const CUSTOMIZE_ENTRY *entry, DWORD dwValue) +{ + SetRestriction(L"Explorer", entry->name, !dwValue); + return TRUE; +} + static const CUSTOMIZE_ENTRY s_CustomizeEntries[] = { // FIXME: Make "StartMenuAdminTools" effective @@ -103,9 +114,7 @@ static const CUSTOMIZE_ENTRY s_CustomizeEntries[] = { IDS_ADVANCED_DISPLAY_FAVORITES, L"StartMenuFavorites", CustomizeRead0, CustomizeWrite0 }, { IDS_ADVANCED_DISPLAY_LOG_OFF, L"StartMenuLogoff", CustomizeRead0, CustomizeWrite0 }, - - // FIXME: SHRestricted is buggy! - //{ IDS_ADVANCED_DISPLAY_RUN, L"NoRun", CustomizeRead2, CustomizeWrite2 }, + { IDS_ADVANCED_DISPLAY_RUN, L"NoRun", CustomizeReadRun, CustomizeWriteRest }, }; static VOID AddCustomizeItem(HWND hTreeView, const CUSTOMIZE_ENTRY *entry) diff --git a/base/shell/explorer/startmnusite.cpp b/base/shell/explorer/startmnusite.cpp index 5f52b43de36..99d851126a8 100644 --- a/base/shell/explorer/startmnusite.cpp +++ b/base/shell/explorer/startmnusite.cpp @@ -216,9 +216,7 @@ public: /* Run */ if (SHRestricted(REST_NORUN)) { - DeleteMenu(hMenu, - IDM_RUN, - MF_BYCOMMAND); + DeleteMenu(hMenu, IDM_RUN, MF_BYCOMMAND); } /* Synchronize */ diff --git a/base/shell/explorer/util.cpp b/base/shell/explorer/util.cpp index f6824cc3de7..51dbee0f3a5 100644 --- a/base/shell/explorer/util.cpp +++ b/base/shell/explorer/util.cpp @@ -163,6 +163,15 @@ BOOL SetAdvancedDword(IN LPCWSTR pszValueName, IN DWORD dwValue) return SetRegDword(REGKEY_ADVANCED, pszValueName, dwValue); } +BOOL SetRestriction(IN LPCWSTR pszKey, IN LPCWSTR pszValueName, IN DWORD dwValue) +{ + WCHAR szSubKey[MAX_PATH] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies"; + PathAppendW(szSubKey, pszKey); + SHSetValueW(HKEY_CURRENT_USER, szSubKey, pszValueName, REG_DWORD, &dwValue, sizeof(dwValue)); + SHSettingsChanged(NULL, NULL); + return TRUE; +} + BOOL GetVersionInfoString(IN LPCWSTR szFileName, IN LPCWSTR szVersionInfo, diff --git a/dll/win32/shell32/dialogs/general.cpp b/dll/win32/shell32/dialogs/general.cpp index 9102c96f43b..33e3e94f73a 100644 --- a/dll/win32/shell32/dialogs/general.cpp +++ b/dll/win32/shell32/dialogs/general.cpp @@ -34,9 +34,6 @@ typedef struct REGSHELLSTATE static const LPCWSTR s_pszExplorerKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"; -extern "C" -BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCVOID inpRegKey); - ///////////////////////////////////////////////////////////////////////////// // Shell settings diff --git a/sdk/include/reactos/undocshell.h b/sdk/include/reactos/undocshell.h index 5d0689827f9..8f180604359 100644 --- a/sdk/include/reactos/undocshell.h +++ b/sdk/include/reactos/undocshell.h @@ -49,14 +49,12 @@ typedef struct _TRAYNOTIFYDATAW #endif /* defined (_SHELLAPI_H) || defined (_INC_SHELLAPI) */ - /**************************************************************************** * Taskbar WM_COMMAND identifiers */ #define TWM_DOEXITWINDOWS (WM_USER + 342) #define TWM_CYCLEFOCUS (WM_USER + 348) - /**************************************************************************** * IDList Functions */ @@ -96,7 +94,6 @@ HRESULT WINAPI SHILCreateFromPathW ( BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*); BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*); - /**************************************************************************** * SHChangeNotifyRegister API */ @@ -258,6 +255,7 @@ ExtractIconResInfoW( /**************************************************************************** * File Menu Routines */ + /* FileMenu_Create nSelHeight constants */ #define FM_DEFAULT_SELHEIGHT -1 #define FM_FULL_SELHEIGHT 0 @@ -732,6 +730,8 @@ Activate_RunDLL( _In_ LPCWSTR cmdline, _In_ INT cmdshow); +BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCWSTR pszKey); + /***************************************************************************** * Shell32 resources */