New+ Feature - Option to hide the built-in New context menu (37545 and 37946)#39843
New+ Feature - Option to hide the built-in New context menu (37545 and 37946)#39843cgaarden wants to merge 10 commits intomicrosoft:mainfrom
Conversation
Tested on Windows 11 x64
…ption-to-disable-existing-new
There was a problem hiding this comment.
Pull Request Overview
This PR implements the option to hide the built-in New context menu by adding registry update logic in the settings UI and ensuring the original context menu is restored on uninstall.
- Updates the NewPlusViewModel with new registry read/write functions and properties to manage the built-in New context menu status.
- Adds a new toggle and elevation warning InfoBar in the settings UI (NewPlusPage.xaml).
- Extends the installer with a custom action to restore the built-in New context menu upon uninstallation.
Reviewed Changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs | New registry logic, properties, and methods to enable/disable the built-in New menu |
| src/settings-ui/Settings.UI/Strings/en-us/Resources.resw | Added localized strings for the new toggle and elevation warning |
| src/settings-ui/Settings.UI/SettingsXAML/Views/NewPlusPage.xaml | New toggle and InfoBar controls for managing the built-in New context menu |
| installer/PowerToysSetupCustomActions/CustomAction.def | Added an export entry for the custom action |
| installer/PowerToysSetupCustomActions/CustomAction.cpp | Implementation of the custom action to restore the built-in New context menu |
| installer/PowerToysSetup/Product.wxs | Integrated the custom action into the installer sequence |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
|
Updated property notification per feedback |
This comment has been minimized.
This comment has been minimized.
…ption-to-disable-existing-new
|
Hi @shuaiyuanxx and @moooyo Wanted to check-in and see if you had any ideas or feedback? Kind regards, |
|
I have no idea on this toy...I didn't touch this part before, any suggestion? @shuaiyuanxx |
|
I will trigger a official build for per-user installer and test it, I afraid if the per-user installer could restore as expect as the per-user will not have UAC popup |
| auto regDeleter = [](HKEY* regKeyHandle) { if (regKeyHandle && *regKeyHandle) RegCloseKey(*regKeyHandle); delete regKeyHandle; }; | ||
| std::unique_ptr<HKEY, decltype(regDeleter)> regKeyHandle(new HKEY(nullptr), regDeleter); | ||
|
|
||
| const LONG openStatus = RegOpenKeyExW(HKEY_CLASSES_ROOT, builtInNewRegistryPath.c_str(), 0, KEY_READ | KEY_WRITE, regKeyHandle.get()); |
There was a problem hiding this comment.
could we separate the machine-level and per-user installers? I confirmed that the built-in New context menu is only in HKLM, but HKCU can override it. So the machine-level installer only needs to write to HKLM, and the per-user installer only needs to write to HKCU — both will work and can stay clean when uninstalled.
There was a problem hiding this comment.
Do you have code example how to know it is per-machine vs per-user installation here to make the right decision?
There was a problem hiding this comment.
we could check the msi InstallScope, in installer, we could do like this
hr = WcaGetProperty(L"InstallScope", ¤tScope);
if (std::wstring{currentScope} == L"perUser")
| private NewPlusSettings Settings { get; set; } | ||
|
|
||
| private const string ModuleName = NewPlusSettings.ModuleName; | ||
| private const string BuiltInNewRegistryPath = @"HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\New"; |
There was a problem hiding this comment.
Do you have code example how to know it is per-machine vs per-user installation here to make the right decision?
There was a problem hiding this comment.
setting-ui, we can use GetCurrentInstallScope()
There was a problem hiding this comment.
Hi @lei9444 and thanks for the feedback
I'm happy to make these changes but I don't see any "New" registry key under HKEY_CURRENT_USER\Software\Classes\Directory\Background\shellex\ContextMenuHandlers
Question:
Do any of you see a key there (HKEY_CURRENT_USER\Software\Classes\Directory\Background\shellex\ContextMenuHandlers\New)?
Alternative implementation:
Based on GetCurrentInstallScope() I could check
If PerMachine
HKEY_CURRENT_USER\Software\Classes\Directory\Background\shellex\ContextMenuHandlers\New AND
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shellex\ContextMenuHandlers\New
If PerUser
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shellex\ContextMenuHandlers\New
But not sure if this is an actual scenario? Any hints on how to reproduce so that I can verify?
Kind regards,
Christian
…ption-to-disable-existing-new
Questions and Suggestions
|
…ption-to-disable-existing-new
|
@
@cgaarden Any thoughts on this? |
|
Hi, Thanks for the ping. Re
All the best, |
Hi @niels9001 - what do you think? And happy to jump on a call to chat/explore options |
|
Closing this PR in favor of: #44979 |
## Summary of the Pull Request - Add the ability for users and admins (GPO) to control whether to display built in New on the context menu. - Changes to the setting are immediately reflected in the experience. - Built-in New is restored on uninstall. ## PR Checklist Note: Supersedes #39843 - [x] **Closes**: [New+] Replace default New entry #37545 and Replace "New" with New+ option #37946 - [x] **Communication:** Discussed with @niels9001 - 1/22/2025 - [x] **Tests:** Completed manual test pass see highlight below - [x] **Localization:** All end-user-facing strings can be localized - [x] **Dev docs:** Updated "doc\devdocs\modules\newplus.md" - [n/a] **New binaries:** Added on the required places - [n/a] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [x] [WXS for installer] Updated installer (uninstall custom action) - [n/a] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [n/a] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [No] **Documentation updated:** Pending, coming soon. (original PR MicrosoftDocs/windows-dev-docs#5473) ## Detailed Description of the Pull Request / Additional comments Added the ability for users' admins' to display Windows built-in New or not I'm NOT aware of an official supported way to do this, so I'm achieving this by adding an invalid context menu handler in place of New in the Computer\HKEY_CURRENT_USER\Software\Classes\Directory\background\ShellEx\ContextMenuHandlers\New Changes are immediate, after applying the change, built-in New is shown/hidden accordingly Updates to New+ Settings UI New setting introduced to track user' preference (saved to newplus/settings.json) GPO setting introduced for control New visibility via GPO (GPO wins over user preference) Updates to New+ power_module.cpp When runner is running new plus will also apply built-in New admin GPO and user preference (GPO wins over user preference) to ensure correct behavior on setting restore and GPO application. Updates to installer Uninstall always reenable built-in "New" context menu Updated DevDoc Added a note on how to manually restore built-in New ## Validation Steps Performed Windows 11 x64 Settings UI New+ enabled New+ disabled GPO setting enabled GPO settings disabled Manually updating newplus/settings.json Windows 11 ARM64 I tested the reg hack manually, but didn't go through a full pass. Windows 10 x64 NOT tested. Windows 11, Settings, New+ Disabled and no GPO <img width="1040" height="1002" alt="image" src="https://github.com/user-attachments/assets/1b827b10-f009-4b0b-954f-d9311d40d201" /> Windows 11, Settings, New+ Enabled and no GPO <img width="1015" height="781" alt="image" src="https://github.com/user-attachments/assets/a5fa09d3-7fd3-4830-99a4-5f2ac9ce1a38" /> Hide built-in New: Off (the default) <img width="321" height="417" alt="image" src="https://github.com/user-attachments/assets/355fea60-bbb8-4f11-b648-291aaf0c4a6d" /> Hide built-in New: On <img width="1015" height="87" alt="image" src="https://github.com/user-attachments/assets/e83e45c4-6b67-443b-b045-26e7dda2cf46" /> Modern <img width="308" height="360" alt="image" src="https://github.com/user-attachments/assets/b164b240-6e67-410c-8481-7db3ee3225b7" /> Classic <img width="308" height="289" alt="image" src="https://github.com/user-attachments/assets/e2b6c262-a311-454c-9c76-40cb11ff2970" /> Disabling New+ also unhide New <img width="1031" height="569" alt="image" src="https://github.com/user-attachments/assets/29b8dae7-8190-4e64-b106-c6861e472a3d" /> <img width="308" height="353" alt="image" src="https://github.com/user-attachments/assets/e1977d6b-dc85-4db4-b9ab-c7bb2b27dde2" /> Windows 11, Settings, New+ Enabled and with GPO Hide built-in New: GPO enabled <img width="1020" height="691" alt="image" src="https://github.com/user-attachments/assets/75053ab8-92c6-4d38-b1b8-9b0d8293c207" /> Hide built-in New: GPO disabled <img width="1050" height="161" alt="image" src="https://github.com/user-attachments/assets/1a50b841-ff01-4662-a923-aee63717c834" />

Summary of the Pull Request
New+ Add the option to hide the built-in New context menu via settings
Note: This setting requires PowerToys to be run as Administrator as it relies on updating the registry
PR Checklist
Detailed Description of the Pull Request / Additional comments
Validation Steps Performed
Windows 11 x64 and Windows 11 ARM64
Windows 10 x64
NOT tested. Do not have a Windows 10 key with me
Windows 11 x64, Non-elevated, New+ Disabled

Windows 11 x64, Non-elevated, New+ Enabled

Windows 11 x64, Elevated, New+ Enabled
