Skip to content

Conversation

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

@cgaarden
Copy link
Contributor Author

Updated property notification per feedback

@github-actions

This comment has been minimized.

@cgaarden
Copy link
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
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
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
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
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
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
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
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
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
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
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
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
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
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,

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.

5 participants