Skip to content

New+ Feature - Option to hide the built-in New context menu (37545 and 37946)#39843

Closed
cgaarden wants to merge 10 commits intomicrosoft:mainfrom
cgaarden:New+feature-37545-option-to-disable-existing-new
Closed

New+ Feature - Option to hide the built-in New context menu (37545 and 37946)#39843
cgaarden wants to merge 10 commits intomicrosoft:mainfrom
cgaarden:New+feature-37545-option-to-disable-existing-new

Conversation

@cgaarden
Copy link
Copy Markdown
Contributor

@cgaarden cgaarden commented Jun 1, 2025

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

  1. Includes updates to PowerToys settings to update the registry to enable/disable the built-in New context menu
  2. Updated installer to reenable New context menu on uninstall

Validation Steps Performed

Windows 11 x64 and Windows 11 ARM64

  1. Settings UI
  2. Non elevated mode
  3. Elevated mode
  4. New+ enabled
  5. New+ disabled

Windows 10 x64
NOT tested. Do not have a Windows 10 key with me

Windows 11 x64, Non-elevated, New+ Disabled
image

Windows 11 x64, Non-elevated, New+ Enabled
image

image

Windows 11 x64, Elevated, New+ Enabled
image

image

@yeelam-gordon yeelam-gordon added the Product-New+ Refers to the New+ PowerToys Utility label Jun 10, 2025
@yeelam-gordon yeelam-gordon requested a review from Copilot June 10, 2025 04:46
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
@cgaarden
Copy link
Copy Markdown
Contributor Author

Updated property notification per feedback

@github-actions

This comment has been minimized.

@cgaarden
Copy link
Copy Markdown
Contributor Author

Hi @shuaiyuanxx and @moooyo

Wanted to check-in and see if you had any ideas or feedback?

Kind regards,
Christian

@moooyo
Copy link
Copy Markdown
Contributor

moooyo commented Aug 19, 2025

I have no idea on this toy...I didn't touch this part before, any suggestion? @shuaiyuanxx

@lei9444
Copy link
Copy Markdown
Contributor

lei9444 commented Aug 20, 2025

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

@lei9444
Copy link
Copy Markdown
Contributor

lei9444 commented Aug 21, 2025

Tested the per-user installer but it couldn’t restore the built-in New context menu:
image

The machine-level installer works fine since it uses UAC to elevate permissions.

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());
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

@yeelam-gordon yeelam-gordon Aug 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you have code example how to know it is per-machine vs per-user installation here to make the right decision?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could check the msi InstallScope, in installer, we could do like this
hr = WcaGetProperty(L"InstallScope", &currentScope);
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";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you have code example how to know it is per-machine vs per-user installation here to make the right decision?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setting-ui, we can use GetCurrentInstallScope()

Copy link
Copy Markdown
Contributor Author

@cgaarden cgaarden Sep 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@yeelam-gordon yeelam-gordon added this to the PowerToys 0.95 milestone Aug 22, 2025
@yeelam-gordon
Copy link
Copy Markdown
Contributor

Questions and Suggestions

  1. Registry Effectiveness
    When we remove/restore the registry, does it take effect in real time, or does it require restarting explorer.exe?
    If it is not real-time effective (especially on restore), then we should not enable this feature yet.

  2. Settings Integration
    We should introduce this option into the settings (JSON).
    Without this, DSC and backup/restore for the setting will not work.
    dllMain for Peek also doesn’t know how to handle it if GPO disables New+ — in that case, the setting should also be restored.

  3. Documentation Update
    We should update the Peek developer readme
    to mention disaster recovery steps. The guidance is on how to restore the setting in case PowerToys cannot start or is gone for unknown reason.

@yeelam-gordon yeelam-gordon added the Needs-input For PRs and Issues: Requesting design or technical input. label Sep 5, 2025
@niels9001
Copy link
Copy Markdown
Collaborator

@

Questions and Suggestions

  1. Registry Effectiveness
    When we remove/restore the registry, does it take effect in real time, or does it require restarting explorer.exe?
    If it is not real-time effective (especially on restore), then we should not enable this feature yet.
  2. Settings Integration
    We should introduce this option into the settings (JSON).
    Without this, DSC and backup/restore for the setting will not work.
    dllMain for Peek also doesn’t know how to handle it if GPO disables New+ — in that case, the setting should also be restored.
  3. Documentation Update
    We should update the Peek developer readme
    to mention disaster recovery steps. The guidance is on how to restore the setting in case PowerToys cannot start or is gone for unknown reason.

@cgaarden Any thoughts on this?

@cgaarden
Copy link
Copy Markdown
Contributor Author

cgaarden commented Dec 5, 2025

Hi,

Thanks for the ping.

Re

  1. Yes the change (on/off) is immediate and requires the PowerToys Settings app to run in admin mode.
  2. I can store the setting the settings file but I'm not sure how I would leverage it. noob questinon: do we have a way of running something in elevated mode other than the installer and the settings app? This was the same reason I didn't add the GPO support for this specific setting. I could perhaps create another custom process that runs at elevated level and monitors for setting changes and apply to the registry.
  3. Good callout, I can look into that too, perhaps once we figure out 1 and 2.

All the best,

@cgaarden
Copy link
Copy Markdown
Contributor Author

Hi,

Thanks for the ping.

Re

  1. Yes the change (on/off) is immediate and requires the PowerToys Settings app to run in admin mode.
  2. I can store the setting the settings file but I'm not sure how I would leverage it. noob question: do we have a way of running something in elevated mode other than the installer and the settings app? This was the same reason I didn't add the GPO support for this specific setting. I could perhaps create another custom process that runs at elevated level and monitors for setting changes and apply to the registry.
  3. Good callout, I can look into that too, perhaps once we figure out 1 and 2.

All the best,

Hi @niels9001 - what do you think? And happy to jump on a call to chat/explore options

@cgaarden cgaarden mentioned this pull request Jan 22, 2026
6 tasks
@niels9001
Copy link
Copy Markdown
Collaborator

Closing this PR in favor of: #44979

@niels9001 niels9001 closed this Jan 28, 2026
niels9001 pushed a commit that referenced this pull request Mar 1, 2026
## 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"
/>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs-input For PRs and Issues: Requesting design or technical input. Product-New+ Refers to the New+ PowerToys Utility

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants