diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt
index a624ef3d49..130f458b55 100644
--- a/.github/actions/spell-check/expect.txt
+++ b/.github/actions/spell-check/expect.txt
@@ -192,6 +192,7 @@ buf
BUFSIZE
bugreport
BUILDARCH
+BUILDNUMBER
buildtask
buildtransitive
Burkina
@@ -466,6 +467,7 @@ dlib
DLIMAGES
dllexport
dllhost
+dllimport
dllmain
dlls
DNLEN
@@ -497,6 +499,7 @@ DVSD
DVSL
DVTARGETDEVICE
DWINRT
+dwl
dwm
dwmapi
dwmcorei
@@ -511,6 +514,7 @@ DWMWCP
DWMWINDOWATTRIBUTE
DWMWINDOWMAXIMIZEDCHANGE
dword
+DWORDLONG
dworigin
dwrite
dxgi
@@ -548,9 +552,9 @@ Eqn
ERASEBKGND
EREOF
EResize
+ERole
ERRORMESSAGE
ERRORTITLE
-ERole
ESettings
esize
esrp
@@ -722,6 +726,7 @@ HHOOK
hhx
Hiber
Hiberboot
+HIBYTE
HICON
HIDEWINDOW
highlighter
@@ -785,6 +790,7 @@ HWNDNEXT
HWNDPREV
IAction
IActivated
+IActivation
IAnimatable
IApp
IApplication
@@ -859,13 +865,15 @@ IInspectable
IIO
IItem
IJson
-IKs
Ijwhost
+IKs
IList
ILogon
IMAGEHLP
imageresizer
+IMAGERESIZERCONTEXTMENU
IMAGERESIZEREXT
+imageresizerinput
imageresizersettings
imagingdevices
IMain
@@ -1092,6 +1100,7 @@ LIBID
Lifecycle
LIGHTORANGE
LIGHTTURQUOISE
+lightunplated
lindex
linkedin
linq
@@ -1107,6 +1116,7 @@ LMEM
LMENU
lnk
LOADSTRING
+LOBYTE
LOCALAPPDATA
LOCALDISPLAY
LOCALPACKAGE
@@ -1168,6 +1178,7 @@ Macquarie
Magadan
Mainwindow
majortype
+MAJORVERSION
makeappx
makecab
MAKEINTRESOURCE
@@ -1239,6 +1250,7 @@ MINIMIZEEND
MINIMIZESTART
miniz
minlevel
+MINORVERSION
Miracast
mirophone
Mishkeegogamang
@@ -1423,6 +1435,7 @@ NTFS
NTSTATUS
nuget
nuint
+nullonfailure
nullopt
nullptr
numberbox
@@ -1468,7 +1481,9 @@ oss
ostr
ostream
ostringstream
+OSVERSIONINFOEX
OSVERSIONINFOEXW
+osvi
otating
OUTOFCONTEXT
OUTOFMEMORY
@@ -1556,6 +1571,8 @@ powercfg
powerlauncher
powerpreview
powerrename
+POWERRENAMECONTEXTMENU
+powerrenameinput
POWERRENAMETEST
powertoy
powertoysinterop
@@ -1770,6 +1787,7 @@ RUNLEVEL
runsettings
runtimeclass
runtimeconfig
+runtimeobject
runtimes
RUS
rvalue
@@ -1965,6 +1983,7 @@ stl
stoi
stol
stoll
+storelogo
stoul
stoull
strcmp
@@ -2167,6 +2186,7 @@ unregister
unregistering
unremapped
unsubscribe
+unvirtualized
Updatelayout
UPGRADINGPRODUCTCODE
upto
@@ -2215,8 +2235,8 @@ VERIFYCONTEXT
verrsrc
VERSIONINFO
Versioning
-VFT
vformat
+VFT
vid
VIDCAP
videoconference
@@ -2267,8 +2287,8 @@ wdp
wdupenv
weakme
webcam
-webserver
webpage
+webserver
website
webview
wekyb
@@ -2298,8 +2318,8 @@ WINDOWPLACEMENT
WINDOWPOSCHANGED
WINDOWPOSCHANGING
Windowsapp
-windowsappsdk
windowsappruntimeinstall
+windowsappsdk
WINDOWSBUILDNUMBER
Windowscodecs
windowsdesktop
@@ -2326,6 +2346,7 @@ winrt
winsdk
winsdkver
winspool
+WINTHRESHOLD
winui
winxamlmanager
wistd
@@ -2369,6 +2390,7 @@ wregex
WResize
writefile
Wrk
+wrl
wsf
wsh
wsl
diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json
index 9c1625f529..e4058d8254 100644
--- a/.pipelines/ESRPSigning_core.json
+++ b/.pipelines/ESRPSigning_core.json
@@ -68,6 +68,8 @@
"modules\\ImageResizer\\PowerToys.ImageResizer.exe",
"modules\\ImageResizer\\PowerToys.ImageResizer.dll",
"modules\\ImageResizer\\PowerToys.ImageResizerExt.dll",
+ "modules\\ImageResizer\\PowerToys.ImageResizerContextMenu.dll",
+ "modules\\ImageResizer\\ImageResizerContextMenuPackage.msix",
"modules\\KeyboardManager\\PowerToys.KeyboardManager.dll",
"modules\\KeyboardManager\\KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe",
@@ -105,6 +107,8 @@
"modules\\PowerRename\\PowerToys.PowerRenameExt.dll",
"modules\\PowerRename\\PowerToys.PowerRename.exe",
+ "modules\\PowerRename\\PowerToys.PowerRenameContextMenu.dll",
+ "modules\\PowerRename\\PowerRenameContextMenuPackage.msix",
"modules\\ShortcutGuide\\ShortcutGuide\\PowerToys.ShortcutGuide.exe",
"modules\\ShortcutGuide\\ShortcutGuideModuleInterface\\PowerToys.ShortcutGuideModuleInterface.dll",
diff --git a/Cpp.Build.props b/Cpp.Build.props
index 059ae21213..b58ed24173 100644
--- a/Cpp.Build.props
+++ b/Cpp.Build.props
@@ -84,7 +84,7 @@
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/PowerToys.sln b/PowerToys.sln
index 1bdda455f5..078ab61953 100644
--- a/PowerToys.sln
+++ b/PowerToys.sln
@@ -279,6 +279,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utils", "utils", "{B39DC643
src\common\utils\modulesRegistry.h = src\common\utils\modulesRegistry.h
src\common\utils\MsiUtils.h = src\common\utils\MsiUtils.h
src\common\utils\os-detect.h = src\common\utils\os-detect.h
+ src\common\utils\package.h = src\common\utils\package.h
src\common\utils\ProcessWaiter.h = src\common\utils\ProcessWaiter.h
src\common\utils\process_path.h = src\common\utils\process_path.h
src\common\utils\registry.h = src\common\utils\registry.h
@@ -404,10 +405,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerToys.Settings", "src\s
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameUI", "src\modules\powerrename\PowerRenameUILib\PowerRenameUI.vcxproj", "{27718999-C175-450A-861C-89F911E16A88}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameContextMenu", "src\modules\powerrename\PowerRenameContextMenu\PowerRenameContextMenu.vcxproj", "{1DBBB112-4BB1-444B-8EBB-E66555C76BA6}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.PowerToys.Run.Plugin.TimeZone.UnitTests", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.TimeZone.UnitTests\Microsoft.PowerToys.Run.Plugin.TimeZone.UnitTests.csproj", "{C5D46169-5334-48C3-8C28-644C72832E54}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.OneNote", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.OneNote\Microsoft.PowerToys.Run.Plugin.OneNote.csproj", "{5A1DB2F0-0715-4B3B-98E6-79BC41540045}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageResizerContextMenu", "src\modules\imageresizer\ImageResizerContextMenu\ImageResizerContextMenu.vcxproj", "{93B72A06-C8BD-484F-A6F7-C9F280B150BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageResizerLib", "src\modules\imageresizer\ImageResizerLib\ImageResizerLib.vcxproj", "{18B3DB45-4FFE-4D01-97D6-5223FEEE1853}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
@@ -1565,6 +1572,18 @@ Global
{27718999-C175-450A-861C-89F911E16A88}.Release|x64.Build.0 = Release|x64
{27718999-C175-450A-861C-89F911E16A88}.Release|x86.ActiveCfg = Release|x64
{27718999-C175-450A-861C-89F911E16A88}.Release|x86.Build.0 = Release|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|ARM64.Build.0 = Debug|ARM64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x64.ActiveCfg = Debug|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x64.Build.0 = Debug|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x86.ActiveCfg = Debug|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x86.Build.0 = Debug|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|ARM64.ActiveCfg = Release|ARM64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|ARM64.Build.0 = Release|ARM64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x64.ActiveCfg = Release|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x64.Build.0 = Release|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x86.ActiveCfg = Release|x64
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x86.Build.0 = Release|x64
{C5D46169-5334-48C3-8C28-644C72832E54}.Debug|ARM64.ActiveCfg = Debug|ARM64
{C5D46169-5334-48C3-8C28-644C72832E54}.Debug|ARM64.Build.0 = Debug|ARM64
{C5D46169-5334-48C3-8C28-644C72832E54}.Debug|x64.ActiveCfg = Debug|x64
@@ -1589,6 +1608,30 @@ Global
{5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x64.Build.0 = Release|x64
{5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x86.ActiveCfg = Release|x64
{5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x86.Build.0 = Release|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|ARM64.Build.0 = Debug|ARM64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x64.ActiveCfg = Debug|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x64.Build.0 = Debug|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x86.ActiveCfg = Debug|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x86.Build.0 = Debug|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|ARM64.ActiveCfg = Release|ARM64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|ARM64.Build.0 = Release|ARM64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x64.ActiveCfg = Release|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x64.Build.0 = Release|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x86.ActiveCfg = Release|x64
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x86.Build.0 = Release|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|ARM64.Build.0 = Debug|ARM64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x64.ActiveCfg = Debug|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x64.Build.0 = Debug|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x86.ActiveCfg = Debug|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x86.Build.0 = Debug|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|ARM64.ActiveCfg = Release|ARM64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|ARM64.Build.0 = Release|ARM64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.ActiveCfg = Release|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.Build.0 = Release|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x86.ActiveCfg = Release|x64
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x86.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1722,8 +1765,11 @@ Global
{8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
{020A7474-3601-4160-A159-D7B70B77B15F} = {C3081D9A-1586-441A-B5F4-ED815B3719C1}
{27718999-C175-450A-861C-89F911E16A88} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
+ {1DBBB112-4BB1-444B-8EBB-E66555C76BA6} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
{C5D46169-5334-48C3-8C28-644C72832E54} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
{5A1DB2F0-0715-4B3B-98E6-79BC41540045} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
+ {93B72A06-C8BD-484F-A6F7-C9F280B150BF} = {6C7F47CC-2151-44A3-A546-41C70025132C}
+ {18B3DB45-4FFE-4D01-97D6-5223FEEE1853} = {6C7F47CC-2151-44A3-A546-41C70025132C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}
diff --git a/doc/devdocs/modules/launcher/plugins/registry.md b/doc/devdocs/modules/launcher/plugins/registry.md
index fba1b4f233..299b77e5af 100644
--- a/doc/devdocs/modules/launcher/plugins/registry.md
+++ b/doc/devdocs/modules/launcher/plugins/registry.md
@@ -78,7 +78,7 @@ The plugin use only these interfaces (all inside the `Main.cs`):
| Name | Value |
| --------------- | ------------------------------------------------------------------------------ |
-| TargetFramework | `net6.0-windows` (.NET 5) or `net6.0-windows10.0.18362.0` (OS version specific)|
+| TargetFramework | `net6.0-windows` (.NET 5) or `net6.0-windows10.0.19041.0` (OS version specific)|
| LangVersion | `8.0` (mean C# 8.0) |
| Platforms | `x64` |
| Nullable | `true` |
diff --git a/doc/devdocs/modules/launcher/plugins/windowssettings.md b/doc/devdocs/modules/launcher/plugins/windowssettings.md
index 6f3701f6b8..a6eafb396c 100644
--- a/doc/devdocs/modules/launcher/plugins/windowssettings.md
+++ b/doc/devdocs/modules/launcher/plugins/windowssettings.md
@@ -141,7 +141,7 @@ Because the JSON file must have a object as root type, instead of a array.
| Name | Value |
| --------------- | --------------------------------------------------------------------------------------------------- |
-| TargetFramework | `net6.0-windows` (.NET 5) or `net6.0-windows10.0.18362.0` (OS version specific) |
+| TargetFramework | `net6.0-windows` (.NET 5) or `net6.0-windows10.0.19041.0` (OS version specific) |
| Platforms | `x64` |
| Output | `..\..\..\..\..\x64\Debug\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.WindowsSettings\` |
| RootNamespace | `Microsoft.PowerToys.Run.Plugin.WindowsSettings` |
diff --git a/installer/MSIX/build_msix_cdpx.cmd b/installer/MSIX/build_msix_cdpx.cmd
index 261a6a6818..d47353ae7f 100644
--- a/installer/MSIX/build_msix_cdpx.cmd
+++ b/installer/MSIX/build_msix_cdpx.cmd
@@ -1,6 +1,6 @@
cd /D "%~dp0"
-call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.18362.0
+call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.19041.0
powershell -file update_appxmanifest_version.ps1 || exit /b 1
diff --git a/installer/PowerToysSetup/PowerToys.wxs b/installer/PowerToysSetup/PowerToys.wxs
index f585c2a381..b53bfd9909 100644
--- a/installer/PowerToysSetup/PowerToys.wxs
+++ b/installer/PowerToysSetup/PowerToys.wxs
@@ -67,7 +67,7 @@
- DetectedWindowsBuildNumber >= 18362 OR WixBundleInstalled
+ DetectedWindowsBuildNumber >= 19041 OR WixBundleInstalled
diff --git a/installer/PowerToysSetup/PowerToysInstaller.wixproj b/installer/PowerToysSetup/PowerToysInstaller.wixproj
index 99419ce6d7..1e387d8d02 100644
--- a/installer/PowerToysSetup/PowerToysInstaller.wixproj
+++ b/installer/PowerToysSetup/PowerToysInstaller.wixproj
@@ -10,7 +10,7 @@
using a specific profile. If you're doing local installer builds, this will
simulate the build pipeline doing that for you. -->
IF NOT DEFINED IsPipeline (
-call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.18362.0
+call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.19041.0
SET PTRoot=..\..\..\..
call "..\..\publish.cmd" x64
)
@@ -19,7 +19,7 @@ call "..\..\publish.cmd" x64
Version=$(Version);MonacoSRCHarvestPath=$(ProjectDir)..\..\ARM64\$(Configuration)\modules\FileExplorerPreview\monacoSRC
IF NOT DEFINED IsPipeline (
-call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 -winsdk=10.0.18362.0
+call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 -winsdk=10.0.19041.0
SET PTRoot=..\..\..\..
call "..\..\publish.cmd" arm64
)
diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs
index abf7d2ca2a..0a863871fe 100644
--- a/installer/PowerToysSetup/Product.wxs
+++ b/installer/PowerToysSetup/Product.wxs
@@ -42,11 +42,11 @@
-
+
-
+
@@ -108,7 +108,11 @@
-
+
+
+
+
+
@@ -136,8 +140,8 @@
-
- = 18362)]]>
+
+ = 19041)]]>
@@ -226,6 +230,9 @@
Installed AND (REMOVE="ALL")
+
+ Installed AND (REMOVE="ALL")
+
@@ -391,7 +406,9 @@
-
+
+
+
@@ -720,6 +737,15 @@
+
+
+
+
+
+
+
+
+
@@ -755,6 +781,12 @@
+
+
+
+
+
+
@@ -779,7 +811,7 @@
- WINDOWSBUILDNUMBER >= 18362
+ WINDOWSBUILDNUMBER >= 19041
@@ -793,7 +825,7 @@
- WINDOWSBUILDNUMBER >= 18362
+ WINDOWSBUILDNUMBER >= 19041
@@ -1011,9 +1043,11 @@
+
+
diff --git a/installer/PowerToysSetupCustomActions/CustomAction.cpp b/installer/PowerToysSetupCustomActions/CustomAction.cpp
index 8a942d3348..b8fa58967f 100644
--- a/installer/PowerToysSetupCustomActions/CustomAction.cpp
+++ b/installer/PowerToysSetupCustomActions/CustomAction.cpp
@@ -11,6 +11,10 @@
#include "../../src/common/updating/installer.h"
#include "../../src/common/version/version.h"
+#include
+#include
+#include
+
using namespace std;
HINSTANCE DLL_HANDLE = nullptr;
@@ -912,7 +916,7 @@ LExit:
if (!SUCCEEDED(hr))
{
PMSIHANDLE hRecord = MsiCreateRecord(0);
- MsiRecordSetString(hRecord, 0, TEXT("Filed to iminstall virtual camera driver"));
+ MsiRecordSetString(hRecord, 0, TEXT("Failed to uninstall virtual camera driver"));
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_WARNING + MB_OK), hRecord);
}
@@ -920,6 +924,78 @@ LExit:
return WcaFinalize(er);
}
+UINT __stdcall UnRegisterContextMenuPackagesCA(MSIHANDLE hInstall)
+{
+ using namespace winrt::Windows::Foundation;
+ using namespace winrt::Windows::Management::Deployment;
+
+ HRESULT hr = S_OK;
+ UINT er = ERROR_SUCCESS;
+
+ hr = WcaInitialize(hInstall, "UnRegisterContextMenuPackagesCA"); // original func name is too long
+
+ try
+ {
+ // Packages to unregister
+ const std::vector packagesToRemoveDisplayName{ { L"PowerRenameContextMenu" }, { L"ImageResizerContextMenu" } };
+
+ PackageManager packageManager;
+
+ for (auto const& package : packageManager.FindPackages())
+ {
+ const auto& packageFullName = std::wstring{ package.Id().FullName() };
+
+ for (const auto& packageToRemove : packagesToRemoveDisplayName)
+ {
+ if (packageFullName.contains(packageToRemove))
+ {
+ auto deploymentOperation{ packageManager.RemovePackageAsync(packageFullName) };
+ deploymentOperation.get();
+
+ // Check the status of the operation
+ if (deploymentOperation.Status() == AsyncStatus::Error)
+ {
+ auto deploymentResult{ deploymentOperation.GetResults() };
+ auto errorCode = deploymentOperation.ErrorCode();
+ auto errorText = deploymentResult.ErrorText();
+
+ Logger::error(L"Unregister {} package failed. ErrorCode: {}, ErrorText: {}", packageFullName, std::to_wstring(errorCode), errorText);
+
+ er = ERROR_INSTALL_FAILURE;
+ }
+ else if (deploymentOperation.Status() == AsyncStatus::Canceled)
+ {
+ Logger::error(L"Unregister {} package canceled.", packageFullName);
+
+ er = ERROR_INSTALL_FAILURE;
+ }
+ else if (deploymentOperation.Status() == AsyncStatus::Completed)
+ {
+ Logger::info(L"Unregister {} package completed.", packageFullName);
+ }
+ else
+ {
+ Logger::debug(L"Unregister {} package started.", packageFullName);
+ }
+ }
+
+ }
+ }
+ }
+ catch (std::exception e)
+ {
+ std::string errorMessage{ "Exception thrown while trying to unregister sparse packages: " };
+ errorMessage += e.what();
+ Logger::error(errorMessage);
+
+ er = ERROR_INSTALL_FAILURE;
+ }
+
+ er = er == ERROR_SUCCESS ? (SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE) : er;
+ return WcaFinalize(er);
+}
+
+
UINT __stdcall TerminateProcessesCA(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
diff --git a/installer/PowerToysSetupCustomActions/CustomAction.def b/installer/PowerToysSetupCustomActions/CustomAction.def
index f8e4d84481..255b64724e 100644
--- a/installer/PowerToysSetupCustomActions/CustomAction.def
+++ b/installer/PowerToysSetupCustomActions/CustomAction.def
@@ -14,10 +14,10 @@ EXPORTS
TelemetryLogRepairCancelCA
TelemetryLogRepairFailCA
TerminateProcessesCA
- TerminateProcessesCA
CertifyVirtualCameraDriverCA
InstallVirtualCameraDriverCA
InstallEmbeddedMSIXCA
UnApplyModulesRegistryChangeSetsCA
UninstallVirtualCameraDriverCA
+ UnRegisterContextMenuPackagesCA
UninstallEmbeddedMSIXCA
\ No newline at end of file
diff --git a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
index f43503577e..277d690bb2 100644
--- a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
+++ b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
@@ -1,12 +1,12 @@
-
+
+
{32f3882b-f2d6-4586-b5ed-11e39e522bd3}
Win32Proj
PowerToysSetupCustomActions
- 10.0.18362.0
+ 10.0.19041.0
PowerToysSetupCustomActions
@@ -43,7 +43,6 @@
false
..\..\src\common\Telemetry;$(IncludePath)
-
inc;..\..\src\;..\..\src\common\Telemetry;telemetry;$(WixSdkPath)VS2017\inc;%(AdditionalIncludeDirectories)
@@ -56,7 +55,6 @@
CustomAction.def
-
WIN64;%(PreprocessorDefinitions)
@@ -65,7 +63,6 @@
$(WixSdkPath)VS2017\lib\$(Platform);%(AdditionalLibraryDirectories)
-
Disabled
@@ -127,5 +124,14 @@
-
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
\ No newline at end of file
diff --git a/installer/PowerToysSetupCustomActions/packages.config b/installer/PowerToysSetupCustomActions/packages.config
index 6b8deb9c96..fa024c0634 100644
--- a/installer/PowerToysSetupCustomActions/packages.config
+++ b/installer/PowerToysSetupCustomActions/packages.config
@@ -1,3 +1,4 @@
+
\ No newline at end of file
diff --git a/src/common/logger/logger_settings.h b/src/common/logger/logger_settings.h
index 87e05ccf2e..5530a2ab8b 100644
--- a/src/common/logger/logger_settings.h
+++ b/src/common/logger/logger_settings.h
@@ -28,6 +28,7 @@ struct LogSettings
inline const static std::string findMyMouseLoggerName = "find-my-mouse";
inline const static std::string mouseHighlighterLoggerName = "mouse-highlighter";
inline const static std::string mousePointerCrosshairsLoggerName = "mouse-pointer-crosshairs";
+ inline const static std::string imageResizerLoggerName = "imageresizer";
inline const static std::string powerRenameLoggerName = "powerrename";
inline const static std::string alwaysOnTopLoggerName = "always-on-top";
inline const static std::wstring alwaysOnTopLogPath = L"always-on-top-log.txt";
diff --git a/src/common/utils/package.h b/src/common/utils/package.h
new file mode 100644
index 0000000000..21fdaa3f84
--- /dev/null
+++ b/src/common/utils/package.h
@@ -0,0 +1,112 @@
+#pragma once
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+
+#include "../logger/logger.h"
+
+namespace package {
+ inline BOOL IsWin11OrGreater()
+ {
+ OSVERSIONINFOEX osvi{};
+ DWORDLONG dwlConditionMask = 0;
+ int op = VER_GREATER_EQUAL;
+
+ // Initialize the OSVERSIONINFOEX structure.
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_WINTHRESHOLD);
+ osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_WINTHRESHOLD);
+ // Windows 11 build number
+ osvi.dwBuildNumber = 22000;
+
+ // Initialize the condition mask.
+ VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
+ VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
+ VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, op);
+
+ // Perform the test.
+ return VerifyVersionInfo(
+ &osvi,
+ VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER,
+ dwlConditionMask);
+ }
+
+ inline bool IsPackageRegistered(std::wstring packageDisplayName)
+ {
+ using namespace winrt::Windows::Foundation;
+ using namespace winrt::Windows::Management::Deployment;
+
+ PackageManager packageManager;
+
+ for (auto const& package : packageManager.FindPackagesForUser({}))
+ {
+ const auto& packageFullName = std::wstring{ package.Id().FullName() };
+
+ if (packageFullName.contains(packageDisplayName))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ inline bool RegisterSparsePackage(std::wstring externalLocation, std::wstring sparsePkgPath)
+ {
+ using namespace winrt::Windows::Foundation;
+ using namespace winrt::Windows::Management::Deployment;
+
+ try
+ {
+ Uri externalUri{ externalLocation };
+ Uri packageUri{ sparsePkgPath };
+
+ PackageManager packageManager;
+
+ // Declare use of an external location
+ AddPackageOptions options;
+ options.ExternalLocationUri(externalUri);
+
+ IAsyncOperationWithProgress deploymentOperation = packageManager.AddPackageByUriAsync(packageUri, options);
+ deploymentOperation.get();
+
+ // Check the status of the operation
+ if (deploymentOperation.Status() == AsyncStatus::Error)
+ {
+ auto deploymentResult{ deploymentOperation.GetResults() };
+ auto errorCode = deploymentOperation.ErrorCode();
+ auto errorText = deploymentResult.ErrorText();
+
+ Logger::error(L"Register {} package failed. ErrorCode: {}, ErrorText: {}", sparsePkgPath, std::to_wstring(errorCode), errorText);
+ return false;
+ }
+ else if (deploymentOperation.Status() == AsyncStatus::Canceled)
+ {
+ Logger::error(L"Register {} package canceled.", sparsePkgPath);
+ return false;
+ }
+ else if (deploymentOperation.Status() == AsyncStatus::Completed)
+ {
+ Logger::info(L"Register {} package completed.", sparsePkgPath);
+ }
+ else
+ {
+ Logger::debug(L"Register {} package started.", sparsePkgPath);
+ }
+
+ return true;
+ }
+ catch (std::exception e)
+ {
+ Logger::error("Exception thrown while trying to register package: {}", e.what());
+
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/logging/logging.vcxproj b/src/logging/logging.vcxproj
index 6f10fa2a2c..3f39a7e647 100644
--- a/src/logging/logging.vcxproj
+++ b/src/logging/logging.vcxproj
@@ -30,7 +30,7 @@
{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}
Win32Proj
spdlog
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/MouseUtils/FindMyMouse/FindMyMouse.vcxproj b/src/modules/MouseUtils/FindMyMouse/FindMyMouse.vcxproj
index 49de3b5068..270ce488e9 100644
--- a/src/modules/MouseUtils/FindMyMouse/FindMyMouse.vcxproj
+++ b/src/modules/MouseUtils/FindMyMouse/FindMyMouse.vcxproj
@@ -7,7 +7,7 @@
Win32Proj
FindMyMouse
true
- 10.0.18362.0
+ 10.0.19041.0
FindMyMouse
diff --git a/src/modules/MouseUtils/MouseHighlighter/MouseHighlighter.vcxproj b/src/modules/MouseUtils/MouseHighlighter/MouseHighlighter.vcxproj
index 84e8024636..e6247ea4d8 100644
--- a/src/modules/MouseUtils/MouseHighlighter/MouseHighlighter.vcxproj
+++ b/src/modules/MouseUtils/MouseHighlighter/MouseHighlighter.vcxproj
@@ -6,7 +6,7 @@
{782a61be-9d85-4081-b35c-1ccc9dcc1e88}
Win32Proj
MouseHighlighter
- 10.0.18362.0
+ 10.0.19041.0
MouseHighlighter
diff --git a/src/modules/MouseUtils/MousePointerCrosshairs/MousePointerCrosshairs.vcxproj b/src/modules/MouseUtils/MousePointerCrosshairs/MousePointerCrosshairs.vcxproj
index d441927e78..7a37790a16 100644
--- a/src/modules/MouseUtils/MousePointerCrosshairs/MousePointerCrosshairs.vcxproj
+++ b/src/modules/MouseUtils/MousePointerCrosshairs/MousePointerCrosshairs.vcxproj
@@ -6,7 +6,7 @@
{eae14c0e-7a6b-45da-9080-a7d8c077ba6e}
Win32Proj
MousePointerCrosshairs
- 10.0.18362.0
+ 10.0.19041.0
MousePointerCrosshairs
diff --git a/src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj b/src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj
index 8a193062f8..37cb052b6b 100644
--- a/src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj
+++ b/src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj
@@ -13,7 +13,7 @@
{2edb3eb4-fa92-4bff-b2d8-566584837231}
Win32Proj
ShortcutGuide
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj b/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj
index 2b5fcb3536..0dc1707709 100644
--- a/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj
+++ b/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj
@@ -9,7 +9,7 @@
Win32Proj
{2d604c07-51fc-46bb-9eb7-75aecc7f5e81}
ShortcutGuideModuleInterface
- 10.0.18362.0
+ 10.0.19041.0
ShortcutGuideModuleInterface
diff --git a/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.vcxproj b/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.vcxproj
index dda951dee6..f06126b3fb 100644
--- a/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.vcxproj
+++ b/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.vcxproj
@@ -56,7 +56,7 @@
- 10.0.18362.0
+ 10.0.19041.0
16.0
Win32Proj
{1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}
diff --git a/src/modules/awake/Awake/Awake.csproj b/src/modules/awake/Awake/Awake.csproj
index 4750822e66..eab00b6914 100644
--- a/src/modules/awake/Awake/Awake.csproj
+++ b/src/modules/awake/Awake/Awake.csproj
@@ -2,7 +2,7 @@
WinExe
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
win-x64;win-arm64
$(SolutionDir)$(Platform)\$(Configuration)\modules\Awake
enable
@@ -14,7 +14,7 @@
PowerToys.Awake
$(Version).0
Images\Awake.ico
- 10.0.18362.0
+ 10.0.19041.0
https://awake.den.dev
https://github.com/microsoft/powertoys
true
diff --git a/src/modules/awake/AwakeModuleInterface/AwakeModuleInterface.vcxproj b/src/modules/awake/AwakeModuleInterface/AwakeModuleInterface.vcxproj
index 8e3bea3abf..ec63f98a90 100644
--- a/src/modules/awake/AwakeModuleInterface/AwakeModuleInterface.vcxproj
+++ b/src/modules/awake/AwakeModuleInterface/AwakeModuleInterface.vcxproj
@@ -7,7 +7,7 @@
Win32Proj
Awake
AwakeModuleInterface
- 10.0.18362.0
+ 10.0.19041.0
PowerToys.AwakeModuleInterface
v143
diff --git a/src/modules/colorPicker/ColorPickerUI/ColorPickerUI.csproj b/src/modules/colorPicker/ColorPickerUI/ColorPickerUI.csproj
index bb95126261..2f3a71065d 100644
--- a/src/modules/colorPicker/ColorPickerUI/ColorPickerUI.csproj
+++ b/src/modules/colorPicker/ColorPickerUI/ColorPickerUI.csproj
@@ -15,7 +15,7 @@
WinExe
ColorPicker
PowerToys.ColorPickerUI
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
8.0
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
diff --git a/src/modules/colorPicker/UnitTest-ColorPickerUI/UnitTest-ColorPickerUI.csproj b/src/modules/colorPicker/UnitTest-ColorPickerUI/UnitTest-ColorPickerUI.csproj
index 73b4136981..71653066af 100644
--- a/src/modules/colorPicker/UnitTest-ColorPickerUI/UnitTest-ColorPickerUI.csproj
+++ b/src/modules/colorPicker/UnitTest-ColorPickerUI/UnitTest-ColorPickerUI.csproj
@@ -2,7 +2,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}
Microsoft.ColorPicker.UnitTests
false
diff --git a/src/modules/fancyzones/FancyZones/FancyZones.vcxproj b/src/modules/fancyzones/FancyZones/FancyZones.vcxproj
index 590f49e11b..c5adb38b94 100644
--- a/src/modules/fancyzones/FancyZones/FancyZones.vcxproj
+++ b/src/modules/fancyzones/FancyZones/FancyZones.vcxproj
@@ -56,7 +56,7 @@
- 10.0.18362.0
+ 10.0.19041.0
16.0
Win32Proj
{ff1d7936-842a-4bbb-8bea-e9fe796de700}
diff --git a/src/modules/fancyzones/FancyZonesTests/UnitTests/UnitTests.vcxproj b/src/modules/fancyzones/FancyZonesTests/UnitTests/UnitTests.vcxproj
index 2a3efeb03e..abda11ccae 100644
--- a/src/modules/fancyzones/FancyZonesTests/UnitTests/UnitTests.vcxproj
+++ b/src/modules/fancyzones/FancyZonesTests/UnitTests/UnitTests.vcxproj
@@ -8,7 +8,7 @@
UnitTests
NativeUnitTestProject
UnitTests-FancyZones
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj b/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj
index a038d23ec0..0dc3066c40 100644
--- a/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj
+++ b/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj
@@ -16,7 +16,7 @@
{5CCC8468-DEC8-4D36-99D4-5C891BEBD481}
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
true
$(SolutionDir)$(Platform)\$(Configuration)\obj\$(AssemblyName)\
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/AppxManifest.xml b/src/modules/imageresizer/ImageResizerContextMenu/AppxManifest.xml
new file mode 100644
index 0000000000..1483c9aa5e
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/AppxManifest.xml
@@ -0,0 +1,55 @@
+
+
+
+
+ Microsoft.PowerToys.ImageResizerContextMenu
+ Microsoft
+ Assets\storelogo.png
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/LargeTile.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/LargeTile.png
new file mode 100644
index 0000000000..53ee3777ea
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/LargeTile.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/SmallTile.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/SmallTile.png
new file mode 100644
index 0000000000..f713bba67f
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/SmallTile.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/SplashScreen.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/SplashScreen.png
new file mode 100644
index 0000000000..ddb349a3d9
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/SplashScreen.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square150x150Logo.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square150x150Logo.png
new file mode 100644
index 0000000000..53ee3777ea
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square150x150Logo.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square44x44Logo.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square44x44Logo.png
new file mode 100644
index 0000000000..f713bba67f
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Square44x44Logo.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/Wide310x150Logo.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Wide310x150Logo.png
new file mode 100644
index 0000000000..8b4a5d0dd5
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/Wide310x150Logo.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Assets/storelogo.png b/src/modules/imageresizer/ImageResizerContextMenu/Assets/storelogo.png
new file mode 100644
index 0000000000..a4586f26bd
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/Assets/storelogo.png differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/ImageResizer.ico b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizer.ico
new file mode 100644
index 0000000000..34234d3e7c
Binary files /dev/null and b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizer.ico differ
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.base.rc b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.base.rc
new file mode 100644
index 0000000000..b55a2b37ad
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.base.rc
@@ -0,0 +1,50 @@
+#include
+#include "Generated Files/resource.h"
+#include "../../../../common/version/version.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+#include "winres.h"
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION FILE_VERSION
+ PRODUCTVERSION PRODUCT_VERSION
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", COMPANY_NAME
+ VALUE "FileDescription", FILE_DESCRIPTION
+ VALUE "FileVersion", FILE_VERSION_STRING
+ VALUE "InternalName", INTERNAL_NAME
+ VALUE "LegalCopyright", COPYRIGHT_NOTE
+ VALUE "OriginalFilename", ORIGINAL_FILENAME
+ VALUE "ProductName", PRODUCT_NAME
+ VALUE "ProductVersion", PRODUCT_VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj
new file mode 100644
index 0000000000..1b6640d617
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+ Win32Proj
+ {93b72a06-c8bd-484f-a6f7-c9f280b150bf}
+ ImageResizerContextMenu
+
+
+
+ DynamicLibrary
+ true
+ v143
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+
+
+
+
+
+
+
+
+
+
+
+ PowerToys.ImageResizerContextMenu
+ $(SolutionDir)$(Platform)\$(Configuration)\modules\ImageResizer\
+
+
+
+ Level3
+ true
+ _DEBUG;IMAGERESIZERCONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ ..\ImageResizerLib;..\..\..\common\inc;..\..\..\common\Telemetry;..\..\;..\..\..\;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ false
+ Source.def
+
+
+ del $(OutDir)*.msix /q
+MakeAppx.exe pack /d . /p $(OutDir)ImageResizerContextMenuPackage.msix /nv
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;IMAGERESIZERCONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ ..\ImageResizerLib;..\..\..\common\inc;..\..\..\common\Telemetry;..\..\;..\..\..\;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ true
+ true
+ false
+ Source.def
+
+
+ del $(OutDir)*.msix /q
+MakeAppx.exe pack /d . /p $(OutDir)ImageResizerContextMenuPackage.msix /nv
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}
+
+
+ {6955446d-23f7-4023-9bb3-8657f904af99}
+
+
+ {18b3db45-4ffe-4d01-97d6-5223feee1853}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj.filters b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj.filters
new file mode 100644
index 0000000000..c0260dea28
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/ImageResizerContextMenu.vcxproj.filters
@@ -0,0 +1,59 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
+ Header Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Resources.resx b/src/modules/imageresizer/ImageResizerContextMenu/Resources.resx
new file mode 100644
index 0000000000..f72fd33367
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/Resources.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Resize pictures
+
+
+ Image Resizer
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/Source.def b/src/modules/imageresizer/ImageResizerContextMenu/Source.def
new file mode 100644
index 0000000000..1ffdadd7a1
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/Source.def
@@ -0,0 +1,5 @@
+LIBRARY
+EXPORTS
+DllCanUnloadNow PRIVATE
+DllGetClassObject PRIVATE
+DllGetActivationFactory PRIVATE
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/dllmain.cpp b/src/modules/imageresizer/ImageResizerContextMenu/dllmain.cpp
new file mode 100644
index 0000000000..d818188c6a
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/dllmain.cpp
@@ -0,0 +1,272 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include "pch.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include "Generated Files/resource.h"
+
+using namespace Microsoft::WRL;
+
+HINSTANCE g_hInst = 0;
+
+#define BUFSIZE 4096 * 4
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ g_hInst = hModule;
+ Trace::RegisterProvider();
+ break;
+ case DLL_PROCESS_DETACH:
+ Trace::UnregisterProvider();
+ break;
+ }
+ return TRUE;
+}
+
+class __declspec(uuid("8F491918-259F-451A-950F-8C3EBF4864AF")) ImageResizerContextMenuCommand final : public RuntimeClass, IExplorerCommand, IObjectWithSite>
+{
+public:
+ virtual const wchar_t* Title() { return L"Image Resizer"; }
+ virtual const EXPCMDFLAGS Flags() { return ECF_DEFAULT; }
+ virtual const EXPCMDSTATE State(_In_opt_ IShellItemArray* selection) { return ECS_ENABLED; }
+
+ // IExplorerCommand
+ IFACEMETHODIMP GetTitle(_In_opt_ IShellItemArray* items, _Outptr_result_nullonfailure_ PWSTR* name)
+ {
+ wchar_t strResizePictures[64] = { 0 };
+ LoadString(g_hInst, IDS_RESIZE_PICTURES_TITLE, strResizePictures, ARRAYSIZE(strResizePictures));
+
+ return SHStrDup(strResizePictures, name);
+ }
+
+ IFACEMETHODIMP GetIcon(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* icon)
+ {
+ std::wstring iconResourcePath = get_module_folderpath(g_hInst);
+ iconResourcePath += L"\\";
+ iconResourcePath += L"ImageResizer.ico";
+ return SHStrDup(iconResourcePath.c_str(), icon);
+ }
+
+ IFACEMETHODIMP GetToolTip(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* infoTip)
+ {
+ *infoTip = nullptr;
+ return E_NOTIMPL;
+ }
+
+ IFACEMETHODIMP GetCanonicalName(_Out_ GUID* guidCommandName)
+ {
+ *guidCommandName = __uuidof(this);
+ return S_OK;
+ }
+
+ IFACEMETHODIMP GetState(_In_opt_ IShellItemArray* selection, _In_ BOOL okToBeSlow, _Out_ EXPCMDSTATE* cmdState)
+ {
+ if (!CSettingsInstance().GetEnabled())
+ {
+ *cmdState = ECS_HIDDEN;
+ return S_OK;
+ }
+ // Hide if the file is not an image
+ *cmdState = ECS_HIDDEN;
+ // Suppressing C26812 warning as the issue is in the shtypes.h library
+#pragma warning(suppress : 26812)
+ PERCEIVED type;
+ PERCEIVEDFLAG flag;
+ IShellItem* shellItem;
+ //Check extension of first item in the list (the item which is right-clicked on)
+ selection->GetItemAt(0, &shellItem);
+ LPTSTR pszPath;
+ // Retrieves the entire file system path of the file from its shell item
+ shellItem->GetDisplayName(SIGDN_FILESYSPATH, &pszPath);
+ LPTSTR pszExt = PathFindExtension(pszPath);
+
+ // TODO: Instead, detect whether there's a WIC codec installed that can handle this file
+ AssocGetPerceivedType(pszExt, &type, &flag, NULL);
+
+ CoTaskMemFree(pszPath);
+ // If selected file is an image...
+
+ if (type == PERCEIVED_TYPE_IMAGE)
+ {
+ *cmdState = ECS_ENABLED;
+ }
+ return S_OK;
+ }
+
+ IFACEMETHODIMP Invoke(_In_opt_ IShellItemArray* selection, _In_opt_ IBindCtx*) noexcept
+ try
+ {
+
+ Trace::Invoked();
+ HRESULT hr = S_OK;
+
+ if (selection)
+ {
+ hr = ResizePictures(selection);
+ }
+
+ Trace::InvokedRet(hr);
+
+ return hr;
+ }
+ CATCH_RETURN();
+
+ IFACEMETHODIMP GetFlags(_Out_ EXPCMDFLAGS* flags)
+ {
+ *flags = Flags();
+ return S_OK;
+ }
+ IFACEMETHODIMP EnumSubCommands(_COM_Outptr_ IEnumExplorerCommand** enumCommands)
+ {
+ *enumCommands = nullptr;
+ return E_NOTIMPL;
+ }
+
+ // IObjectWithSite
+ IFACEMETHODIMP SetSite(_In_ IUnknown* site) noexcept
+ {
+ m_site = site;
+ return S_OK;
+ }
+ IFACEMETHODIMP GetSite(_In_ REFIID riid, _COM_Outptr_ void** site) noexcept { return m_site.CopyTo(riid, site); }
+
+protected:
+ ComPtr m_site;
+
+private:
+ HRESULT StartNamedPipeServerAndSendData(std::wstring pipe_name)
+ {
+ hPipe = CreateNamedPipe(
+ pipe_name.c_str(),
+ PIPE_ACCESS_DUPLEX |
+ WRITE_DAC,
+ PIPE_TYPE_MESSAGE |
+ PIPE_READMODE_MESSAGE |
+ PIPE_WAIT,
+ PIPE_UNLIMITED_INSTANCES,
+ BUFSIZE,
+ BUFSIZE,
+ 0,
+ NULL);
+
+ if (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE)
+ {
+ return E_FAIL;
+ }
+
+ // This call blocks until a client process connects to the pipe
+ BOOL connected = ConnectNamedPipe(hPipe, NULL);
+ if (!connected)
+ {
+ if (GetLastError() == ERROR_PIPE_CONNECTED)
+ {
+ return S_OK;
+ }
+ else
+ {
+ CloseHandle(hPipe);
+ }
+ return E_FAIL;
+ }
+
+ return S_OK;
+ }
+
+ HRESULT ResizePictures(IShellItemArray* psiItemArray)
+ {
+ // Set the application path based on the location of the dll
+ std::wstring path = get_module_folderpath(g_hInst);
+ path = path + L"\\PowerToys.ImageResizer.exe";
+
+ std::wstring pipe_name(L"\\\\.\\pipe\\powertoys_imageresizerinput_");
+ UUID temp_uuid;
+ wchar_t* uuid_chars = nullptr;
+ if (UuidCreate(&temp_uuid) == RPC_S_UUID_NO_ADDRESS)
+ {
+ auto val = get_last_error_message(GetLastError());
+ Logger::warn(L"UuidCreate can not create guid. {}", val.has_value() ? val.value() : L"");
+ }
+ else if (UuidToString(&temp_uuid, (RPC_WSTR*)&uuid_chars) != RPC_S_OK)
+ {
+ auto val = get_last_error_message(GetLastError());
+ Logger::warn(L"UuidToString can not convert to string. {}", val.has_value() ? val.value() : L"");
+ }
+
+ if (uuid_chars != nullptr)
+ {
+ pipe_name += std::wstring(uuid_chars);
+ RpcStringFree((RPC_WSTR*)&uuid_chars);
+ uuid_chars = nullptr;
+ }
+ create_pipe_thread = std::thread(&ImageResizerContextMenuCommand::StartNamedPipeServerAndSendData, this, pipe_name);
+ RunNonElevatedEx(path.c_str(), pipe_name, get_module_folderpath(g_hInst));
+ create_pipe_thread.join();
+
+ if (hPipe != INVALID_HANDLE_VALUE)
+ {
+ CAtlFile writePipe(hPipe);
+
+ //m_pdtobj will be NULL when invoked from the MSIX build as Initialize is never called (IShellExtInit functions aren't called in case of MSIX).
+ DWORD fileCount = 0;
+ // Gets the list of files currently selected using the IShellItemArray
+ psiItemArray->GetCount(&fileCount);
+ // Iterate over the list of files
+ for (DWORD i = 0; i < fileCount; i++)
+ {
+ IShellItem* shellItem;
+ psiItemArray->GetItemAt(i, &shellItem);
+ LPWSTR itemName;
+ // Retrieves the entire file system path of the file from its shell item
+ shellItem->GetDisplayName(SIGDN_FILESYSPATH, &itemName);
+ CString fileName(itemName);
+ fileName.Append(_T("\r\n"));
+ // Write the file path into the input stream for image resizer
+ writePipe.Write(fileName, fileName.GetLength() * sizeof(TCHAR));
+ }
+ writePipe.Close();
+ }
+
+ return S_OK;
+ }
+
+ std::thread create_pipe_thread;
+ HANDLE hPipe = INVALID_HANDLE_VALUE;
+ std::wstring app_name = L"ImageResizer";
+};
+
+CoCreatableClass(ImageResizerContextMenuCommand)
+CoCreatableClassWrlCreatorMapInclude(ImageResizerContextMenuCommand)
+
+
+STDAPI DllGetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IActivationFactory** factory)
+{
+ return Module::GetModule().GetActivationFactory(activatableClassId, factory);
+}
+
+STDAPI DllCanUnloadNow()
+{
+ return Module::GetModule().GetObjectCount() == 0 ? S_OK : S_FALSE;
+}
+
+STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _COM_Outptr_ void** instance)
+{
+ return Module::GetModule().GetClassObject(rclsid, riid, instance);
+}
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/framework.h b/src/modules/imageresizer/ImageResizerContextMenu/framework.h
new file mode 100644
index 0000000000..54b83e94fd
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/framework.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+// Windows Header Files
+#include
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/packages.config b/src/modules/imageresizer/ImageResizerContextMenu/packages.config
new file mode 100644
index 0000000000..ed327ca35a
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/pch.cpp b/src/modules/imageresizer/ImageResizerContextMenu/pch.cpp
new file mode 100644
index 0000000000..64b7eef6d6
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/pch.h b/src/modules/imageresizer/ImageResizerContextMenu/pch.h
new file mode 100644
index 0000000000..885d5d62e4
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/pch.h
@@ -0,0 +1,13 @@
+// pch.h: This is a precompiled header file.
+// Files listed below are compiled only once, improving build performance for future builds.
+// This also affects IntelliSense performance, including code completion and many code browsing features.
+// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+// Do not add files here that you will be updating frequently as this negates the performance advantage.
+
+#ifndef PCH_H
+#define PCH_H
+
+// add headers that you want to pre-compile here
+#include "framework.h"
+
+#endif //PCH_H
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/resource.base.h b/src/modules/imageresizer/ImageResizerContextMenu/resource.base.h
new file mode 100644
index 0000000000..b362797710
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/resource.base.h
@@ -0,0 +1,13 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by ImageResizerContextMenu.rc
+
+//////////////////////////////
+// Non-localizable
+
+#define FILE_DESCRIPTION "PowerToys Image Resizer Context Menu"
+#define INTERNAL_NAME "PowerToys.ImageResizerContextMenu.dll"
+#define ORIGINAL_FILENAME "PowerToys.ImageResizerContextMenu.dll"
+
+// Non-localizable
+//////////////////////////////
diff --git a/src/modules/imageresizer/ImageResizerContextMenu/targetver.h b/src/modules/imageresizer/ImageResizerContextMenu/targetver.h
new file mode 100644
index 0000000000..1530e99ea6
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerContextMenu/targetver.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#include
+#include
diff --git a/src/modules/imageresizer/dll/ImageResizerConstants.h b/src/modules/imageresizer/ImageResizerLib/ImageResizerConstants.h
similarity index 100%
rename from src/modules/imageresizer/dll/ImageResizerConstants.h
rename to src/modules/imageresizer/ImageResizerLib/ImageResizerConstants.h
diff --git a/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj b/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj
new file mode 100644
index 0000000000..93350cf0db
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj
@@ -0,0 +1,83 @@
+
+
+
+ Win32Proj
+ {18b3db45-4ffe-4d01-97d6-5223feee1853}
+ ImageResizerLib
+ 10.0.19041.0
+
+
+ StaticLibrary
+ v143
+ Unicode
+
+
+
+ true
+
+
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)$(Platform)\$(Configuration)\modules\ImageResizer\
+
+
+ PowerToys.$(ProjectName)
+
+
+
+ Level3
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ Use
+ ..\..\..\common\Telemetry;..\..\..\;%(AdditionalIncludeDirectories)
+
+
+
+
+ true
+
+
+
+
+ Level3
+ true
+ true
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ Use
+ ..\..\..\common\Telemetry;..\..\..\;%(AdditionalIncludeDirectories)
+
+
+
+
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+ Create
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj.filters b/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj.filters
new file mode 100644
index 0000000000..e09410a77c
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerLib/ImageResizerLib.vcxproj.filters
@@ -0,0 +1,45 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/src/modules/imageresizer/dll/Settings.cpp b/src/modules/imageresizer/ImageResizerLib/Settings.cpp
similarity index 94%
rename from src/modules/imageresizer/dll/Settings.cpp
rename to src/modules/imageresizer/ImageResizerLib/Settings.cpp
index f59eb5c86b..3631ebd68a 100644
--- a/src/modules/imageresizer/dll/Settings.cpp
+++ b/src/modules/imageresizer/ImageResizerLib/Settings.cpp
@@ -1,125 +1,125 @@
-#include "pch.h"
-#include "Settings.h"
-
-#include
-#include
-#include
-#include
-#include
-
-namespace
-{
- const wchar_t c_imageResizerDataFilePath[] = L"\\image-resizer-settings.json";
- const wchar_t c_rootRegPath[] = L"Software\\Microsoft\\ImageResizer";
- const wchar_t c_enabled[] = L"Enabled";
-
- unsigned int RegReadInteger(const std::wstring& valueName, unsigned int defaultValue)
- {
- DWORD type = REG_DWORD;
- DWORD data = 0;
- DWORD size = sizeof(DWORD);
- if (SHGetValue(HKEY_CURRENT_USER, c_rootRegPath, valueName.c_str(), &type, &data, &size) == ERROR_SUCCESS)
- {
- return data;
- }
- return defaultValue;
- }
-
- bool RegReadBoolean(const std::wstring& valueName, bool defaultValue)
- {
- DWORD value = RegReadInteger(valueName.c_str(), defaultValue ? 1 : 0);
- return (value == 0) ? false : true;
- }
-
- bool LastModifiedTime(const std::wstring& filePath, FILETIME* lpFileTime)
- {
- WIN32_FILE_ATTRIBUTE_DATA attr{};
- if (GetFileAttributesExW(filePath.c_str(), GetFileExInfoStandard, &attr))
- {
- *lpFileTime = attr.ftLastWriteTime;
- return true;
- }
- return false;
- }
-}
-
-CSettings::CSettings()
-{
- std::wstring oldSavePath = PTSettingsHelper::get_module_save_folder_location(ImageResizerConstants::ModuleOldSaveFolderKey);
- std::wstring savePath = PTSettingsHelper::get_module_save_folder_location(ImageResizerConstants::ModuleSaveFolderKey);
- std::error_code ec;
- if (std::filesystem::exists(oldSavePath, ec))
- {
- std::filesystem::copy(oldSavePath, savePath, std::filesystem::copy_options::recursive, ec);
- std::filesystem::remove_all(oldSavePath, ec);
- }
-
- jsonFilePath = savePath + std::wstring(c_imageResizerDataFilePath);
- Load();
-}
-
-void CSettings::Save()
-{
- json::JsonObject jsonData;
-
- jsonData.SetNamedValue(c_enabled, json::value(settings.enabled));
-
- json::to_file(jsonFilePath, jsonData);
- GetSystemTimeAsFileTime(&lastLoadedTime);
-}
-
-void CSettings::Load()
-{
- if (!std::filesystem::exists(jsonFilePath))
- {
- MigrateFromRegistry();
-
- Save();
- }
- else
- {
- ParseJson();
- }
-}
-
-void CSettings::Reload()
-{
- // Load json settings from data file if it is modified in the meantime.
- FILETIME lastModifiedTime{};
- if (LastModifiedTime(jsonFilePath, &lastModifiedTime) &&
- CompareFileTime(&lastModifiedTime, &lastLoadedTime) == 1)
- {
- Load();
- }
-}
-
-void CSettings::MigrateFromRegistry()
-{
- settings.enabled = RegReadBoolean(c_enabled, true);
-}
-
-void CSettings::ParseJson()
-{
- auto json = json::from_file(jsonFilePath);
- if (json)
- {
- const json::JsonObject& jsonSettings = json.value();
- try
- {
- if (json::has(jsonSettings, c_enabled, json::JsonValueType::Boolean))
- {
- settings.enabled = jsonSettings.GetNamedBoolean(c_enabled);
- }
- }
- catch (const winrt::hresult_error&)
- {
- }
- }
- GetSystemTimeAsFileTime(&lastLoadedTime);
-}
-
-CSettings& CSettingsInstance()
-{
- static CSettings instance;
- return instance;
+#include "pch.h"
+#include "Settings.h"
+#include "ImageResizerConstants.h"
+
+#include
+#include
+#include
+#include
+
+namespace
+{
+ const wchar_t c_imageResizerDataFilePath[] = L"\\image-resizer-settings.json";
+ const wchar_t c_rootRegPath[] = L"Software\\Microsoft\\ImageResizer";
+ const wchar_t c_enabled[] = L"Enabled";
+
+ unsigned int RegReadInteger(const std::wstring& valueName, unsigned int defaultValue)
+ {
+ DWORD type = REG_DWORD;
+ DWORD data = 0;
+ DWORD size = sizeof(DWORD);
+ if (SHGetValue(HKEY_CURRENT_USER, c_rootRegPath, valueName.c_str(), &type, &data, &size) == ERROR_SUCCESS)
+ {
+ return data;
+ }
+ return defaultValue;
+ }
+
+ bool RegReadBoolean(const std::wstring& valueName, bool defaultValue)
+ {
+ DWORD value = RegReadInteger(valueName.c_str(), defaultValue ? 1 : 0);
+ return (value == 0) ? false : true;
+ }
+
+ bool LastModifiedTime(const std::wstring& filePath, FILETIME* lpFileTime)
+ {
+ WIN32_FILE_ATTRIBUTE_DATA attr{};
+ if (GetFileAttributesExW(filePath.c_str(), GetFileExInfoStandard, &attr))
+ {
+ *lpFileTime = attr.ftLastWriteTime;
+ return true;
+ }
+ return false;
+ }
+}
+
+CSettings::CSettings()
+{
+ std::wstring oldSavePath = PTSettingsHelper::get_module_save_folder_location(ImageResizerConstants::ModuleOldSaveFolderKey);
+ std::wstring savePath = PTSettingsHelper::get_module_save_folder_location(ImageResizerConstants::ModuleSaveFolderKey);
+ std::error_code ec;
+ if (std::filesystem::exists(oldSavePath, ec))
+ {
+ std::filesystem::copy(oldSavePath, savePath, std::filesystem::copy_options::recursive, ec);
+ std::filesystem::remove_all(oldSavePath, ec);
+ }
+
+ jsonFilePath = savePath + std::wstring(c_imageResizerDataFilePath);
+ Load();
+}
+
+void CSettings::Save()
+{
+ json::JsonObject jsonData;
+
+ jsonData.SetNamedValue(c_enabled, json::value(settings.enabled));
+
+ json::to_file(jsonFilePath, jsonData);
+ GetSystemTimeAsFileTime(&lastLoadedTime);
+}
+
+void CSettings::Load()
+{
+ if (!std::filesystem::exists(jsonFilePath))
+ {
+ MigrateFromRegistry();
+
+ Save();
+ }
+ else
+ {
+ ParseJson();
+ }
+}
+
+void CSettings::Reload()
+{
+ // Load json settings from data file if it is modified in the meantime.
+ FILETIME lastModifiedTime{};
+ if (LastModifiedTime(jsonFilePath, &lastModifiedTime) &&
+ CompareFileTime(&lastModifiedTime, &lastLoadedTime) == 1)
+ {
+ Load();
+ }
+}
+
+void CSettings::MigrateFromRegistry()
+{
+ settings.enabled = RegReadBoolean(c_enabled, true);
+}
+
+void CSettings::ParseJson()
+{
+ auto json = json::from_file(jsonFilePath);
+ if (json)
+ {
+ const json::JsonObject& jsonSettings = json.value();
+ try
+ {
+ if (json::has(jsonSettings, c_enabled, json::JsonValueType::Boolean))
+ {
+ settings.enabled = jsonSettings.GetNamedBoolean(c_enabled);
+ }
+ }
+ catch (const winrt::hresult_error&)
+ {
+ }
+ }
+ GetSystemTimeAsFileTime(&lastLoadedTime);
+}
+
+CSettings& CSettingsInstance()
+{
+ static CSettings instance;
+ return instance;
}
\ No newline at end of file
diff --git a/src/modules/imageresizer/dll/Settings.h b/src/modules/imageresizer/ImageResizerLib/Settings.h
similarity index 93%
rename from src/modules/imageresizer/dll/Settings.h
rename to src/modules/imageresizer/ImageResizerLib/Settings.h
index f0b51861df..aaff4793b7 100644
--- a/src/modules/imageresizer/dll/Settings.h
+++ b/src/modules/imageresizer/ImageResizerLib/Settings.h
@@ -1,38 +1,38 @@
-#pragma once
-
-class CSettings
-{
-public:
- CSettings();
-
- inline bool GetEnabled()
- {
- Reload();
- return settings.enabled;
- }
-
- inline void SetEnabled(bool enabled)
- {
- settings.enabled = enabled;
- Save();
- }
-
- void Save();
- void Load();
-
-private:
- struct Settings
- {
- bool enabled{ true };
- };
-
- void Reload();
- void MigrateFromRegistry();
- void ParseJson();
-
- Settings settings;
- std::wstring jsonFilePath;
- FILETIME lastLoadedTime;
-};
-
+#pragma once
+
+class CSettings
+{
+public:
+ CSettings();
+
+ inline bool GetEnabled()
+ {
+ Reload();
+ return settings.enabled;
+ }
+
+ inline void SetEnabled(bool enabled)
+ {
+ settings.enabled = enabled;
+ Save();
+ }
+
+ void Save();
+ void Load();
+
+private:
+ struct Settings
+ {
+ bool enabled{ true };
+ };
+
+ void Reload();
+ void MigrateFromRegistry();
+ void ParseJson();
+
+ Settings settings;
+ std::wstring jsonFilePath;
+ FILETIME lastLoadedTime;
+};
+
CSettings& CSettingsInstance();
\ No newline at end of file
diff --git a/src/modules/imageresizer/ImageResizerLib/framework.h b/src/modules/imageresizer/ImageResizerLib/framework.h
new file mode 100644
index 0000000000..34edb144a5
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerLib/framework.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+// Windows Header Files:
+#include
diff --git a/src/modules/imageresizer/ImageResizerLib/pch.cpp b/src/modules/imageresizer/ImageResizerLib/pch.cpp
new file mode 100644
index 0000000000..64b7eef6d6
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerLib/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/src/modules/imageresizer/ImageResizerLib/pch.h b/src/modules/imageresizer/ImageResizerLib/pch.h
new file mode 100644
index 0000000000..dcca9b830b
--- /dev/null
+++ b/src/modules/imageresizer/ImageResizerLib/pch.h
@@ -0,0 +1,18 @@
+// pch.h: This is a precompiled header file.
+// Files listed below are compiled only once, improving build performance for future builds.
+// This also affects IntelliSense performance, including code completion and many code browsing features.
+// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+// Do not add files here that you will be updating frequently as this negates the performance advantage.
+
+#ifndef PCH_H
+#define PCH_H
+
+// add headers that you want to pre-compile here
+#include "framework.h"
+
+#include
+#include
+
+#include
+
+#endif //PCH_H
diff --git a/src/modules/imageresizer/dll/trace.cpp b/src/modules/imageresizer/ImageResizerLib/trace.cpp
similarity index 96%
rename from src/modules/imageresizer/dll/trace.cpp
rename to src/modules/imageresizer/ImageResizerLib/trace.cpp
index 84171932d0..352af3676a 100644
--- a/src/modules/imageresizer/dll/trace.cpp
+++ b/src/modules/imageresizer/ImageResizerLib/trace.cpp
@@ -1,59 +1,59 @@
-#include "pch.h"
-#include "trace.h"
-
-TRACELOGGING_DEFINE_PROVIDER(
- g_hProvider,
- "Microsoft.PowerToys",
- // {38e8889b-9731-53f5-e901-e8a7c1753074}
- (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74),
- TraceLoggingOptionProjectTelemetry());
-
-void Trace::RegisterProvider() noexcept
-{
- TraceLoggingRegister(g_hProvider);
-}
-
-void Trace::UnregisterProvider() noexcept
-{
- TraceLoggingUnregister(g_hProvider);
-}
-
-void Trace::EnableImageResizer(_In_ bool enabled) noexcept
-{
- TraceLoggingWrite(
- g_hProvider,
- "ImageResizer_EnableImageResizer",
- ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
- TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE),
- TraceLoggingBoolean(enabled, "Enabled"));
-}
-
-
-void Trace::Invoked() noexcept
-{
- TraceLoggingWrite(
- g_hProvider,
- "ImageResizer_Invoked",
- ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
- TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
-}
-
-void Trace::InvokedRet(_In_ HRESULT hr) noexcept
-{
- TraceLoggingWrite(
- g_hProvider,
- "ImageResizer_InvokedRet",
- ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
- TraceLoggingHResult(hr),
- TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
-}
-
-void Trace::QueryContextMenuError(_In_ HRESULT hr) noexcept
-{
- TraceLoggingWrite(
- g_hProvider,
- "ImageResizer_QueryContextMenuError",
- ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
- TraceLoggingHResult(hr),
- TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
-}
+#include "pch.h"
+#include "trace.h"
+
+TRACELOGGING_DEFINE_PROVIDER(
+ g_hProvider,
+ "Microsoft.PowerToys",
+ // {38e8889b-9731-53f5-e901-e8a7c1753074}
+ (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74),
+ TraceLoggingOptionProjectTelemetry());
+
+void Trace::RegisterProvider() noexcept
+{
+ TraceLoggingRegister(g_hProvider);
+}
+
+void Trace::UnregisterProvider() noexcept
+{
+ TraceLoggingUnregister(g_hProvider);
+}
+
+void Trace::EnableImageResizer(_In_ bool enabled) noexcept
+{
+ TraceLoggingWrite(
+ g_hProvider,
+ "ImageResizer_EnableImageResizer",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE),
+ TraceLoggingBoolean(enabled, "Enabled"));
+}
+
+
+void Trace::Invoked() noexcept
+{
+ TraceLoggingWrite(
+ g_hProvider,
+ "ImageResizer_Invoked",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
+}
+
+void Trace::InvokedRet(_In_ HRESULT hr) noexcept
+{
+ TraceLoggingWrite(
+ g_hProvider,
+ "ImageResizer_InvokedRet",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingHResult(hr),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
+}
+
+void Trace::QueryContextMenuError(_In_ HRESULT hr) noexcept
+{
+ TraceLoggingWrite(
+ g_hProvider,
+ "ImageResizer_QueryContextMenuError",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingHResult(hr),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
+}
diff --git a/src/modules/imageresizer/dll/trace.h b/src/modules/imageresizer/ImageResizerLib/trace.h
similarity index 96%
rename from src/modules/imageresizer/dll/trace.h
rename to src/modules/imageresizer/ImageResizerLib/trace.h
index 5f1bada262..9ff1e49f4e 100644
--- a/src/modules/imageresizer/dll/trace.h
+++ b/src/modules/imageresizer/ImageResizerLib/trace.h
@@ -1,12 +1,12 @@
-#pragma once
-
-class Trace
-{
-public:
- static void RegisterProvider() noexcept;
- static void UnregisterProvider() noexcept;
- static void EnableImageResizer(_In_ bool enabled) noexcept;
- static void Invoked() noexcept;
- static void InvokedRet(_In_ HRESULT hr) noexcept;
- static void QueryContextMenuError(_In_ HRESULT hr) noexcept;
+#pragma once
+
+class Trace
+{
+public:
+ static void RegisterProvider() noexcept;
+ static void UnregisterProvider() noexcept;
+ static void EnableImageResizer(_In_ bool enabled) noexcept;
+ static void Invoked() noexcept;
+ static void InvokedRet(_In_ HRESULT hr) noexcept;
+ static void QueryContextMenuError(_In_ HRESULT hr) noexcept;
};
\ No newline at end of file
diff --git a/src/modules/imageresizer/dll/ContextMenuHandler.cpp b/src/modules/imageresizer/dll/ContextMenuHandler.cpp
index 9d86398ae1..3296c1c91c 100644
--- a/src/modules/imageresizer/dll/ContextMenuHandler.cpp
+++ b/src/modules/imageresizer/dll/ContextMenuHandler.cpp
@@ -2,13 +2,15 @@
#include "pch.h"
#include "ContextMenuHandler.h"
-#include "Settings.h"
+
+#include
+#include
+
#include
#include
#include
#include
-
-#include "trace.h"
+#include
extern HINSTANCE g_hInst_imageResizer;
@@ -61,6 +63,9 @@ HRESULT CContextMenuHandler::Initialize(_In_opt_ PCIDLIST_ABSOLUTE pidlFolder, _
HRESULT CContextMenuHandler::QueryContextMenu(_In_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
+ if (package::IsWin11OrGreater())
+ return E_FAIL;
+
if (uFlags & CMF_DEFAULTONLY)
{
return S_OK;
diff --git a/src/modules/imageresizer/dll/ImageResizerExt.vcxproj b/src/modules/imageresizer/dll/ImageResizerExt.vcxproj
index acd2ee1868..c2f64e4ae0 100644
--- a/src/modules/imageresizer/dll/ImageResizerExt.vcxproj
+++ b/src/modules/imageresizer/dll/ImageResizerExt.vcxproj
@@ -32,7 +32,7 @@
_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
- ..\..\..\common\inc;..\..\..\common\Telemetry;..\..\;..\..\..\;%(AdditionalIncludeDirectories)
+ ..\ImageResizerLib;..\..\..\common\inc;..\..\..\common\Telemetry;..\..\;..\..\..\;%(AdditionalIncludeDirectories)
.\ImageResizerExt.def
@@ -89,23 +89,18 @@
-
Create
-
-
-
-
@@ -121,12 +116,18 @@
+
+ {d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}
+
{6955446d-23f7-4023-9bb3-8657f904af99}
{98537082-0fdb-40de-abd8-0dc5a4269bab}
+
+ {18b3db45-4ffe-4d01-97d6-5223feee1853}
+
@@ -135,6 +136,7 @@
+
diff --git a/src/modules/imageresizer/dll/ImageResizerExt.vcxproj.filters b/src/modules/imageresizer/dll/ImageResizerExt.vcxproj.filters
index dd6a23aa9a..d12fe0cf53 100644
--- a/src/modules/imageresizer/dll/ImageResizerExt.vcxproj.filters
+++ b/src/modules/imageresizer/dll/ImageResizerExt.vcxproj.filters
@@ -28,15 +28,6 @@
Source Files
-
- Source Files
-
-
- Source Files
-
-
- Header Files
-
Generated Files
@@ -54,9 +45,6 @@
Header Files
-
- Header Files
-
Header Files
@@ -66,9 +54,6 @@
Generated Files
-
- Header Files
-
diff --git a/src/modules/imageresizer/dll/dllmain.cpp b/src/modules/imageresizer/dll/dllmain.cpp
index f369445c52..e622306e01 100644
--- a/src/modules/imageresizer/dll/dllmain.cpp
+++ b/src/modules/imageresizer/dll/dllmain.cpp
@@ -2,12 +2,18 @@
#include "Generated Files/resource.h"
#include "ImageResizerExt_i.h"
#include "dllmain.h"
-#include
+
+#include
+#include
+#include
+
+#include
#include
+#include
+#include
#include
-#include "Settings.h"
-#include "trace.h"
-#include
+#include
+#include
CImageResizerExtModule _AtlModule;
HINSTANCE g_hInst_imageResizer = 0;
@@ -43,6 +49,7 @@ public:
m_enabled = CSettingsInstance().GetEnabled();
app_name = GET_RESOURCE_STRING(IDS_IMAGERESIZER);
app_key = ImageResizerConstants::ModuleKey;
+ LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::imageResizerLoggerName);
};
// Destroy the powertoy and free memory
@@ -89,6 +96,20 @@ public:
{
m_enabled = true;
CSettingsInstance().SetEnabled(m_enabled);
+
+ if (package::IsWin11OrGreater())
+ {
+ std::wstring path = get_module_folderpath(g_hInst_imageResizer);
+ std::wstring packageUri = path + L"\\ImageResizerContextMenuPackage.msix";
+
+ std::wstring packageDisplayName{ L"ImageResizerContextMenu" };
+ if (!package::IsPackageRegistered(packageDisplayName))
+ {
+ package::RegisterSparsePackage(path, packageUri);
+ }
+ }
+
+
Trace::EnableImageResizer(m_enabled);
}
diff --git a/src/modules/imageresizer/tests/ImageResizerUITest.csproj b/src/modules/imageresizer/tests/ImageResizerUITest.csproj
index 7c78ce1133..8e056e45e2 100644
--- a/src/modules/imageresizer/tests/ImageResizerUITest.csproj
+++ b/src/modules/imageresizer/tests/ImageResizerUITest.csproj
@@ -2,7 +2,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}
Library
Properties
diff --git a/src/modules/imageresizer/ui/ImageResizerUI.csproj b/src/modules/imageresizer/ui/ImageResizerUI.csproj
index 77b2fac87d..b46119102f 100644
--- a/src/modules/imageresizer/ui/ImageResizerUI.csproj
+++ b/src/modules/imageresizer/ui/ImageResizerUI.csproj
@@ -15,7 +15,7 @@
WinExe
ImageResizer
PowerToys.ImageResizer
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(SolutionDir)$(Platform)\$(Configuration)\obj\$(AssemblyName)\
diff --git a/src/modules/imageresizer/ui/Models/ResizeBatch.cs b/src/modules/imageresizer/ui/Models/ResizeBatch.cs
index f24b34ff55..0916961531 100644
--- a/src/modules/imageresizer/ui/Models/ResizeBatch.cs
+++ b/src/modules/imageresizer/ui/Models/ResizeBatch.cs
@@ -7,6 +7,8 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.IO.Abstractions;
+using System.IO.Pipes;
+using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ImageResizer.Properties;
@@ -24,16 +26,8 @@ namespace ImageResizer.Models
public static ResizeBatch FromCommandLine(TextReader standardInput, string[] args)
{
var batch = new ResizeBatch();
-
- // NB: We read these from stdin since there are limits on the number of args you can have
- string file;
- if (standardInput != null)
- {
- while ((file = standardInput.ReadLine()) != null)
- {
- batch.Files.Add(file);
- }
- }
+ const string pipeNamePrefix = "\\\\.\\pipe\\";
+ string pipeName = null;
for (var i = 0; i < args?.Length; i++)
{
@@ -42,10 +36,48 @@ namespace ImageResizer.Models
batch.DestinationDirectory = args[++i];
continue;
}
+ else if (args[i].Contains(pipeNamePrefix))
+ {
+ pipeName = args[i].Substring(pipeNamePrefix.Length);
+ continue;
+ }
batch.Files.Add(args[i]);
}
+ if (string.IsNullOrEmpty(pipeName))
+ {
+ // NB: We read these from stdin since there are limits on the number of args you can have
+ string file;
+ if (standardInput != null)
+ {
+ while ((file = standardInput.ReadLine()) != null)
+ {
+ batch.Files.Add(file);
+ }
+ }
+ }
+ else
+ {
+ using (NamedPipeClientStream pipeClient =
+ new NamedPipeClientStream(".", pipeName, PipeDirection.In))
+ {
+ // Connect to the pipe or wait until the pipe is available.
+ pipeClient.Connect();
+
+ using (StreamReader sr = new StreamReader(pipeClient, Encoding.Unicode))
+ {
+ string file;
+
+ // Display the read text to the console
+ while ((file = sr.ReadLine()) != null)
+ {
+ batch.Files.Add(file);
+ }
+ }
+ }
+ }
+
return batch;
}
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.exe.manifest b/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.exe.manifest
index e70a561c0f..9f80c67839 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.exe.manifest
+++ b/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.exe.manifest
@@ -8,7 +8,7 @@
-
+
\ No newline at end of file
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.vcxproj
index fa4feb87cb..93758a4a27 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.vcxproj
@@ -64,8 +64,8 @@
{8df78b53-200e-451f-9328-01eb907193ae}
KeyboardManagerEditor
true
- 10.0.18362.0
- 10.0.18362.0
+ 10.0.19041.0
+ 10.0.19041.0
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorLibrary/KeyboardManagerEditorLibrary.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEditorLibrary/KeyboardManagerEditorLibrary.vcxproj
index a66ece0e96..4d02bfd093 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorLibrary/KeyboardManagerEditorLibrary.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorLibrary/KeyboardManagerEditorLibrary.vcxproj
@@ -7,8 +7,8 @@
{23d2070d-e4ad-4add-85a7-083d9c76ad49}
KeyboardManagerEditorLibrary
true
- 10.0.18362.0
- 10.0.18362.0
+ 10.0.19041.0
+ 10.0.19041.0
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorTest/KeyboardManagerEditorTest.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEditorTest/KeyboardManagerEditorTest.vcxproj
index 54ef1fdef2..6f77ed779d 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorTest/KeyboardManagerEditorTest.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorTest/KeyboardManagerEditorTest.vcxproj
@@ -7,7 +7,7 @@
Win32Proj
KeyboardManagerEditorTest
true
- 10.0.18362.0
+ 10.0.19041.0
NativeUnitTestProject
diff --git a/src/modules/keyboardmanager/KeyboardManagerEngine/KeyboardManagerEngine.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEngine/KeyboardManagerEngine.vcxproj
index f69c7b75b7..aa874c2659 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEngine/KeyboardManagerEngine.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEngine/KeyboardManagerEngine.vcxproj
@@ -11,8 +11,8 @@
Win32Proj
KeyboardManagerEngine
true
- 10.0.18362.0
- 10.0.18362.0
+ 10.0.19041.0
+ 10.0.19041.0
diff --git a/src/modules/keyboardmanager/KeyboardManagerEngineLibrary/KeyboardManagerEngineLibrary.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEngineLibrary/KeyboardManagerEngineLibrary.vcxproj
index 1b880b10a2..d6c6058b2a 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEngineLibrary/KeyboardManagerEngineLibrary.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEngineLibrary/KeyboardManagerEngineLibrary.vcxproj
@@ -7,8 +7,8 @@
{e496b7fc-1e99-4bab-849b-0e8367040b02}
KeyboardManagerEngineLibrary
true
- 10.0.18362.0
- 10.0.18362.0
+ 10.0.19041.0
+ 10.0.19041.0
diff --git a/src/modules/keyboardmanager/KeyboardManagerEngineTest/KeyboardManagerEngineTest.vcxproj b/src/modules/keyboardmanager/KeyboardManagerEngineTest/KeyboardManagerEngineTest.vcxproj
index 630f6be05a..c7fb801d75 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEngineTest/KeyboardManagerEngineTest.vcxproj
+++ b/src/modules/keyboardmanager/KeyboardManagerEngineTest/KeyboardManagerEngineTest.vcxproj
@@ -7,7 +7,7 @@
Win32Proj
KeyboardManagerEngineTest
true
- 10.0.18362.0
+ 10.0.19041.0
NativeUnitTestProject
KeyboardManagerEngineTest
diff --git a/src/modules/keyboardmanager/common/KeyboardManagerCommon.vcxproj b/src/modules/keyboardmanager/common/KeyboardManagerCommon.vcxproj
index 04fb18936d..0656e08b2a 100644
--- a/src/modules/keyboardmanager/common/KeyboardManagerCommon.vcxproj
+++ b/src/modules/keyboardmanager/common/KeyboardManagerCommon.vcxproj
@@ -6,7 +6,7 @@
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}
KeyboardManagerCommon
true
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/keyboardmanager/dll/KeyboardManager.vcxproj b/src/modules/keyboardmanager/dll/KeyboardManager.vcxproj
index 42be4a35bc..29e2a696ee 100644
--- a/src/modules/keyboardmanager/dll/KeyboardManager.vcxproj
+++ b/src/modules/keyboardmanager/dll/KeyboardManager.vcxproj
@@ -7,7 +7,7 @@
Win32Proj
KeyboardManager
true
- 10.0.18362.0
+ 10.0.19041.0
KeyboardManager
diff --git a/src/modules/launcher/Microsoft.Launcher/Microsoft.Launcher.vcxproj b/src/modules/launcher/Microsoft.Launcher/Microsoft.Launcher.vcxproj
index fe8507eb60..45f827c566 100644
--- a/src/modules/launcher/Microsoft.Launcher/Microsoft.Launcher.vcxproj
+++ b/src/modules/launcher/Microsoft.Launcher/Microsoft.Launcher.vcxproj
@@ -10,7 +10,7 @@
Win32Proj
Wox_Launcher
Microsoft.Launcher
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml
index f18af9d980..cec2e4d0cf 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml
@@ -8,7 +8,7 @@
Assets\StoreLogo.png
-
+
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml
index 3d35b6cd2b..da04bb3114 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml
@@ -8,7 +8,7 @@
Assets\StoreLogo.png
-
+
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml
index 19501281f7..61ae22b9c6 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml
@@ -8,7 +8,7 @@
Assets\StoreLogo.png
-
+
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj
index 13634c1fd4..f8a7c08261 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj
@@ -1,7 +1,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
false
AppxManifests\developmentApp\AppxManifest.xml
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj
index b635ca2cc7..2f8b373b6c 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj
@@ -2,7 +2,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}
Properties
Microsoft.Plugin.Program
diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.UnitTests/Microsoft.Plugin.WindowsTerminal.UnitTests.csproj b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.UnitTests/Microsoft.Plugin.WindowsTerminal.UnitTests.csproj
index c150e3141d..20676364f8 100644
--- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.UnitTests/Microsoft.Plugin.WindowsTerminal.UnitTests.csproj
+++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.UnitTests/Microsoft.Plugin.WindowsTerminal.UnitTests.csproj
@@ -1,7 +1,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
false
diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.csproj b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.csproj
index 765cff35d2..439c3dc705 100644
--- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.csproj
+++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.WindowsTerminal/Microsoft.PowerToys.Run.Plugin.WindowsTerminal.csproj
@@ -3,7 +3,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
Microsoft.PowerToys.Run.Plugin.WindowsTerminal
Microsoft.PowerToys.Run.Plugin.WindowsTerminal
$(Version).0
diff --git a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj
index ff472f28c4..9127c4e449 100644
--- a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj
+++ b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj
@@ -3,7 +3,7 @@
PowerToys.Run
WinExe
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
true
PowerLauncher.App
diff --git a/src/modules/launcher/PowerLauncher/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/modules/launcher/PowerLauncher/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 9244003dd4..2d6ffbf5cc 100644
--- a/src/modules/launcher/PowerLauncher/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/modules/launcher/PowerLauncher/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\modules\launcher
win-$(Platform)
false
diff --git a/src/modules/launcher/Wox.Test/Wox.Test.csproj b/src/modules/launcher/Wox.Test/Wox.Test.csproj
index b1ae13c949..eaeddda0b6 100644
--- a/src/modules/launcher/Wox.Test/Wox.Test.csproj
+++ b/src/modules/launcher/Wox.Test/Wox.Test.csproj
@@ -2,7 +2,7 @@
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{FF742965-9A80-41A5-B042-D6C7D3A21708}
Library
Properties
diff --git a/src/modules/powerrename/PowerRenameContextMenu/AppxManifest.xml b/src/modules/powerrename/PowerRenameContextMenu/AppxManifest.xml
new file mode 100644
index 0000000000..efe640dfa8
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/AppxManifest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ PowerRenameContextMenu
+ Microsoft
+ Assets\storelogo.png
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/LargeTile.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/LargeTile.png
new file mode 100644
index 0000000000..53ee3777ea
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/LargeTile.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/SmallTile.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/SmallTile.png
new file mode 100644
index 0000000000..f713bba67f
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/SmallTile.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/SplashScreen.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/SplashScreen.png
new file mode 100644
index 0000000000..ddb349a3d9
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/SplashScreen.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/Square150x150Logo.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/Square150x150Logo.png
new file mode 100644
index 0000000000..53ee3777ea
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/Square150x150Logo.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/Square44x44Logo.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/Square44x44Logo.png
new file mode 100644
index 0000000000..f713bba67f
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/Square44x44Logo.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/Wide310x150Logo.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/Wide310x150Logo.png
new file mode 100644
index 0000000000..8b4a5d0dd5
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/Wide310x150Logo.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Assets/storelogo.png b/src/modules/powerrename/PowerRenameContextMenu/Assets/storelogo.png
new file mode 100644
index 0000000000..a4586f26bd
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/Assets/storelogo.png differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.rc b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.rc
new file mode 100644
index 0000000000..3b3fdcbfd2
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.rc
@@ -0,0 +1,60 @@
+// Microsoft Visual C++ generated resource script.
+//
+
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 9, 1
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj
new file mode 100644
index 0000000000..f6a829d364
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj
@@ -0,0 +1,128 @@
+
+
+
+
+ 16.0
+ Win32Proj
+ {1dbbb112-4bb1-444b-8ebb-e66555c76ba6}
+ PowerRenameContextMenu
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+ PowerToys.PowerRenameContextMenu
+ $(SolutionDir)$(Platform)\$(Configuration)\modules\PowerRename\
+
+
+
+ Level3
+ true
+ _DEBUG;POWERRENAMECONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ ..\..\..\;..\lib\;..\..\;..\..\..\common\telemetry;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ false
+ runtimeobject.lib;%(AdditionalDependencies)
+ Source.def
+
+
+ del $(OutDir)*.msix /q
+MakeAppx.exe pack /d . /p $(OutDir)PowerRenameContextMenuPackage.msix /nv
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;POWERRENAMECONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ ..\..\..\;..\lib\;..\..\;..\..\..\common\telemetry;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ true
+ true
+ false
+ runtimeobject.lib;%(AdditionalDependencies)
+ Source.def
+
+
+ del $(OutDir)*.msix /q
+MakeAppx.exe pack /d . /p $(OutDir)PowerRenameContextMenuPackage.msix /nv
+
+
+
+
+
+
+
+
+
+
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}
+
+
+ {51920f1f-c28c-4adf-8660-4238766796c2}
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj.filters b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj.filters
new file mode 100644
index 0000000000..2189b10388
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameContextMenu.vcxproj.filters
@@ -0,0 +1,742 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
+
+ Resource Files
+
+
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/src/modules/powerrename/PowerRenameContextMenu/PowerRenameUI.ico b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameUI.ico
new file mode 100644
index 0000000000..4f111feaac
Binary files /dev/null and b/src/modules/powerrename/PowerRenameContextMenu/PowerRenameUI.ico differ
diff --git a/src/modules/powerrename/PowerRenameContextMenu/Source.def b/src/modules/powerrename/PowerRenameContextMenu/Source.def
new file mode 100644
index 0000000000..1ffdadd7a1
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/Source.def
@@ -0,0 +1,5 @@
+LIBRARY
+EXPORTS
+DllCanUnloadNow PRIVATE
+DllGetClassObject PRIVATE
+DllGetActivationFactory PRIVATE
\ No newline at end of file
diff --git a/src/modules/powerrename/PowerRenameContextMenu/dllmain.cpp b/src/modules/powerrename/PowerRenameContextMenu/dllmain.cpp
new file mode 100644
index 0000000000..70d574aa16
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/dllmain.cpp
@@ -0,0 +1,277 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include "pch.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+using namespace Microsoft::WRL;
+
+HINSTANCE g_hInst = 0;
+
+#define BUFSIZE 4096 * 4
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ g_hInst = hModule;
+ Trace::RegisterProvider();
+ break;
+ case DLL_PROCESS_DETACH:
+ Trace::UnregisterProvider();
+ break;
+ }
+ return TRUE;
+}
+
+class __declspec(uuid("1861E28B-A1F0-4EF4-A1FE-4C8CA88E2174")) PowerRenameContextMenuCommand final : public RuntimeClass, IExplorerCommand, IObjectWithSite>
+{
+public:
+ virtual const wchar_t* Title() { return L"PowerRename"; }
+ virtual const EXPCMDFLAGS Flags() { return ECF_DEFAULT; }
+ virtual const EXPCMDSTATE State(_In_opt_ IShellItemArray* selection) { return ECS_ENABLED; }
+
+ // IExplorerCommand
+ IFACEMETHODIMP GetTitle(_In_opt_ IShellItemArray* items, _Outptr_result_nullonfailure_ PWSTR* name)
+ {
+ return SHStrDup(app_name.c_str(), name);
+ }
+
+ IFACEMETHODIMP GetIcon(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* icon)
+ {
+ if (!CSettingsInstance().GetShowIconOnMenu())
+ {
+ *icon = nullptr;
+ return E_NOTIMPL;
+ }
+
+ std::wstring iconResourcePath = get_module_folderpath(g_hInst);
+ iconResourcePath += L"\\";
+ iconResourcePath += L"PowerRenameUI.ico";
+ return SHStrDup(iconResourcePath.c_str(), icon);
+ }
+
+ IFACEMETHODIMP GetToolTip(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* infoTip)
+ {
+ *infoTip = nullptr;
+ return E_NOTIMPL;
+ }
+
+ IFACEMETHODIMP GetCanonicalName(_Out_ GUID* guidCommandName)
+ {
+ *guidCommandName = __uuidof(this);
+ return S_OK;
+ }
+
+ IFACEMETHODIMP GetState(_In_opt_ IShellItemArray* selection, _In_ BOOL okToBeSlow, _Out_ EXPCMDSTATE* cmdState)
+ {
+ *cmdState = ECS_ENABLED;
+
+ if (!CSettingsInstance().GetEnabled())
+ {
+ *cmdState = ECS_HIDDEN;
+ return S_OK;
+ }
+
+ // Check if we should only be on the extended context menu
+ if (CSettingsInstance().GetExtendedContextMenuOnly())
+ {
+ *cmdState = ECS_HIDDEN;
+ return S_OK;
+ }
+
+ // Check if at least one of the selected items is actually renamable.
+ if (!ShellItemArrayContainsRenamableItem(selection))
+ {
+ *cmdState = ECS_HIDDEN;
+ return S_OK;
+ }
+
+ return S_OK;
+ }
+
+ IFACEMETHODIMP Invoke(_In_opt_ IShellItemArray* selection, _In_opt_ IBindCtx*) noexcept
+ try
+ {
+ if (selection)
+ {
+ RunPowerRename(selection);
+ }
+
+ return S_OK;
+ }
+ CATCH_RETURN();
+
+ IFACEMETHODIMP GetFlags(_Out_ EXPCMDFLAGS* flags)
+ {
+ *flags = Flags();
+ return S_OK;
+ }
+ IFACEMETHODIMP EnumSubCommands(_COM_Outptr_ IEnumExplorerCommand** enumCommands)
+ {
+ *enumCommands = nullptr;
+ return E_NOTIMPL;
+ }
+
+ // IObjectWithSite
+ IFACEMETHODIMP SetSite(_In_ IUnknown* site) noexcept
+ {
+ m_site = site;
+ return S_OK;
+ }
+ IFACEMETHODIMP GetSite(_In_ REFIID riid, _COM_Outptr_ void** site) noexcept { return m_site.CopyTo(riid, site); }
+
+protected:
+ ComPtr m_site;
+
+private:
+
+ HRESULT StartNamedPipeServerAndSendData(std::wstring pipe_name)
+ {
+ hPipe = CreateNamedPipe(
+ pipe_name.c_str(),
+ PIPE_ACCESS_DUPLEX |
+ WRITE_DAC,
+ PIPE_TYPE_MESSAGE |
+ PIPE_READMODE_MESSAGE |
+ PIPE_WAIT,
+ PIPE_UNLIMITED_INSTANCES,
+ BUFSIZE,
+ BUFSIZE,
+ 0,
+ NULL);
+
+ if (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE)
+ {
+ return E_FAIL;
+ }
+
+ // This call blocks until a client process connects to the pipe
+ BOOL connected = ConnectNamedPipe(hPipe, NULL);
+ if (!connected)
+ {
+ if (GetLastError() == ERROR_PIPE_CONNECTED)
+ {
+ return S_OK;
+ }
+ else
+ {
+ CloseHandle(hPipe);
+ }
+ return E_FAIL;
+ }
+
+ return S_OK;
+ }
+
+ HRESULT RunPowerRename(IShellItemArray* psiItemArray)
+ {
+ if (CSettingsInstance().GetEnabled())
+ {
+ Trace::Invoked();
+ // Set the application path based on the location of the dll
+ std::wstring path = get_module_folderpath(g_hInst);
+ path = path + L"\\PowerToys.PowerRename.exe";
+
+ std::wstring pipe_name(L"\\\\.\\pipe\\powertoys_powerrenameinput_");
+ UUID temp_uuid;
+ wchar_t* uuid_chars = nullptr;
+ if (UuidCreate(&temp_uuid) == RPC_S_UUID_NO_ADDRESS)
+ {
+ auto val = get_last_error_message(GetLastError());
+ Logger::warn(L"UuidCreate can not create guid. {}", val.has_value() ? val.value() : L"");
+ }
+ else if (UuidToString(&temp_uuid, (RPC_WSTR*)&uuid_chars) != RPC_S_OK)
+ {
+ auto val = get_last_error_message(GetLastError());
+ Logger::warn(L"UuidToString can not convert to string. {}", val.has_value() ? val.value() : L"");
+ }
+
+ if (uuid_chars != nullptr)
+ {
+ pipe_name += std::wstring(uuid_chars);
+ RpcStringFree((RPC_WSTR*)&uuid_chars);
+ uuid_chars = nullptr;
+ }
+ create_pipe_thread = std::thread(&PowerRenameContextMenuCommand::StartNamedPipeServerAndSendData, this, pipe_name);
+ RunNonElevatedEx(path.c_str(), pipe_name, get_module_folderpath(g_hInst));
+ create_pipe_thread.join();
+
+ if (hPipe != INVALID_HANDLE_VALUE)
+ {
+ CAtlFile writePipe(hPipe);
+
+ DWORD fileCount = 0;
+ // Gets the list of files currently selected using the IShellItemArray
+ psiItemArray->GetCount(&fileCount);
+ // Iterate over the list of files
+ for (DWORD i = 0; i < fileCount; i++)
+ {
+ IShellItem* shellItem;
+ psiItemArray->GetItemAt(i, &shellItem);
+ LPWSTR itemName;
+ // Retrieves the entire file system path of the file from its shell item
+ shellItem->GetDisplayName(SIGDN_FILESYSPATH, &itemName);
+ CString fileName(itemName);
+ // File name can't contain '?'
+ fileName.Append(_T("?"));
+ // Write the file path into the input stream for image resizer
+ writePipe.Write(fileName, fileName.GetLength() * sizeof(TCHAR));
+ }
+ writePipe.Close();
+ }
+ }
+ Trace::InvokedRet(S_OK);
+
+ return S_OK;
+ }
+
+
+ std::thread create_pipe_thread;
+ HANDLE hPipe = INVALID_HANDLE_VALUE;
+ std::wstring app_name = L"PowerRename";
+};
+
+CoCreatableClass(PowerRenameContextMenuCommand)
+CoCreatableClassWrlCreatorMapInclude(PowerRenameContextMenuCommand)
+
+STDAPI DllGetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IActivationFactory** factory)
+{
+ return Module::GetModule().GetActivationFactory(activatableClassId, factory);
+}
+
+STDAPI DllCanUnloadNow()
+{
+ return Module::GetModule().GetObjectCount() == 0 ? S_OK : S_FALSE;
+}
+
+STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _COM_Outptr_ void** instance)
+{
+ return Module::GetModule().GetClassObject(rclsid, riid, instance);
+}
\ No newline at end of file
diff --git a/src/modules/powerrename/PowerRenameContextMenu/framework.h b/src/modules/powerrename/PowerRenameContextMenu/framework.h
new file mode 100644
index 0000000000..54b83e94fd
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/framework.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+// Windows Header Files
+#include
diff --git a/src/modules/powerrename/PowerRenameContextMenu/packages.config b/src/modules/powerrename/PowerRenameContextMenu/packages.config
new file mode 100644
index 0000000000..ed327ca35a
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/powerrename/PowerRenameContextMenu/pch.cpp b/src/modules/powerrename/PowerRenameContextMenu/pch.cpp
new file mode 100644
index 0000000000..64b7eef6d6
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/src/modules/powerrename/PowerRenameContextMenu/pch.h b/src/modules/powerrename/PowerRenameContextMenu/pch.h
new file mode 100644
index 0000000000..885d5d62e4
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/pch.h
@@ -0,0 +1,13 @@
+// pch.h: This is a precompiled header file.
+// Files listed below are compiled only once, improving build performance for future builds.
+// This also affects IntelliSense performance, including code completion and many code browsing features.
+// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+// Do not add files here that you will be updating frequently as this negates the performance advantage.
+
+#ifndef PCH_H
+#define PCH_H
+
+// add headers that you want to pre-compile here
+#include "framework.h"
+
+#endif //PCH_H
diff --git a/src/modules/powerrename/PowerRenameContextMenu/resource.h b/src/modules/powerrename/PowerRenameContextMenu/resource.h
new file mode 100644
index 0000000000..70ea8e555c
--- /dev/null
+++ b/src/modules/powerrename/PowerRenameContextMenu/resource.h
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by PowerRenameContextMenu.rc
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/modules/powerrename/PowerRenameUILib/App.xaml.cpp b/src/modules/powerrename/PowerRenameUILib/App.xaml.cpp
index 38aa58bf21..4cdf8669d0 100644
--- a/src/modules/powerrename/PowerRenameUILib/App.xaml.cpp
+++ b/src/modules/powerrename/PowerRenameUILib/App.xaml.cpp
@@ -53,15 +53,60 @@ void App::OnLaunched(LaunchActivatedEventArgs const&)
{
LoggerHelpers::init_logger(moduleName, L"", LogSettings::powerRenameLoggerName);
-#define BUFSIZE 4096 * 4
+ auto args = std::wstring{ GetCommandLine() };
+ size_t pos{ args.rfind(L"\\\\.\\pipe\\") };
+
+ std::wstring pipe_name;
+ if (pos != std::wstring::npos)
+ {
+ pipe_name = args.substr(pos);
+ }
+
+ HANDLE hStdin;
+
+ if (pipe_name.size() > 0)
+ {
+ while (1)
+ {
+ hStdin = CreateFile(
+ pipe_name.c_str(), // pipe name
+ GENERIC_READ | GENERIC_WRITE, // read and write
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ // Break if the pipe handle is valid.
+ if (hStdin != INVALID_HANDLE_VALUE)
+ break;
+
+ // Exit if an error other than ERROR_PIPE_BUSY occurs.
+ auto error = GetLastError();
+ if (error != ERROR_PIPE_BUSY)
+ {
+ break;
+ }
+
+ if (!WaitNamedPipe(pipe_name.c_str(), 3))
+ {
+ printf("Could not open pipe: 20 second wait timed out.");
+ }
+ }
+ }
+ else
+ {
+ hStdin = GetStdHandle(STD_INPUT_HANDLE);
+ }
- HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
{
Logger::error(L"Invalid input handle.");
ExitProcess(1);
}
+#define BUFSIZE 4096 * 4
+
BOOL bSuccess;
WCHAR chBuf[BUFSIZE];
DWORD dwRead;
@@ -86,6 +131,7 @@ void App::OnLaunched(LaunchActivatedEventArgs const&)
if (!bSuccess)
break;
}
+ CloseHandle(hStdin);
Logger::debug(L"Starting PowerRename with {} files selected", g_files.size());
diff --git a/src/modules/powerrename/PowerRenameUILib/PowerRenameUI.vcxproj b/src/modules/powerrename/PowerRenameUILib/PowerRenameUI.vcxproj
index d760ad982a..97d78f39d4 100644
--- a/src/modules/powerrename/PowerRenameUILib/PowerRenameUI.vcxproj
+++ b/src/modules/powerrename/PowerRenameUILib/PowerRenameUI.vcxproj
@@ -22,7 +22,7 @@
None
Windows Store
10.0
- 10.0.18362.0
+ 10.0.19041.0
10.0.17763.0
true
true
diff --git a/src/modules/powerrename/dll/PowerRenameExt.cpp b/src/modules/powerrename/dll/PowerRenameExt.cpp
index 58c73a317c..26d0f22ac2 100644
--- a/src/modules/powerrename/dll/PowerRenameExt.cpp
+++ b/src/modules/powerrename/dll/PowerRenameExt.cpp
@@ -6,9 +6,10 @@
#include
#include "Generated Files/resource.h"
-#include
-#include
#include
+#include
+#include
+#include
extern HINSTANCE g_hInst;
@@ -63,9 +64,24 @@ HRESULT CPowerRenameMenu::QueryContextMenu(HMENU hMenu, UINT index, UINT uIDFirs
if (!CSettingsInstance().GetEnabled())
return E_FAIL;
- // Check if we should only be on the extended context menu
- if (CSettingsInstance().GetExtendedContextMenuOnly() && (!(uFlags & CMF_EXTENDEDVERBS)))
- return E_FAIL;
+ // Win11 context menu can't distinguish between extended and default menu, so use this one
+ if (package::IsWin11OrGreater())
+ {
+ if (CSettingsInstance().GetExtendedContextMenuOnly() && (uFlags & CMF_EXTENDEDVERBS))
+ {
+ // continue
+ }
+ else
+ {
+ return E_FAIL;
+ }
+ }
+ else
+ {
+ // Check if we should only be on the extended context menu
+ if (CSettingsInstance().GetExtendedContextMenuOnly() && (!(uFlags & CMF_EXTENDEDVERBS)))
+ return E_FAIL;
+ }
// Check if at least one of the selected items is actually renamable.
if (!DataObjectContainsRenamableItem(m_spdo))
diff --git a/src/modules/powerrename/dll/PowerRenameExt.vcxproj b/src/modules/powerrename/dll/PowerRenameExt.vcxproj
index 83b3ce76c3..ebdb4c373a 100644
--- a/src/modules/powerrename/dll/PowerRenameExt.vcxproj
+++ b/src/modules/powerrename/dll/PowerRenameExt.vcxproj
@@ -8,7 +8,7 @@
15.0
{B25AC7A5-FB9F-4789-B392-D5C85E948670}
PowerRenameExt
- 10.0.18362.0
+ 10.0.19041.0
@@ -64,6 +64,9 @@
{98537082-0fdb-40de-abd8-0dc5a4269bab}
+
+ {cc6e41ac-8174-4e8a-8d22-85dd7f4851df}
+
{51920f1f-c28c-4adf-8660-4238766796c2}
diff --git a/src/modules/powerrename/dll/dllmain.cpp b/src/modules/powerrename/dll/dllmain.cpp
index d615703924..4b01877df7 100644
--- a/src/modules/powerrename/dll/dllmain.cpp
+++ b/src/modules/powerrename/dll/dllmain.cpp
@@ -1,15 +1,22 @@
#include "pch.h"
+
+#include "Generated Files/resource.h"
+#include "PowerRenameConstants.h"
#include "PowerRenameExt.h"
+
#include
#include
#include
+#include
+
#include
#include
#include
+#include
+#include
#include
-#include "Generated Files/resource.h"
+
#include
-#include
std::atomic g_dwModuleRefCount = 0;
HINSTANCE g_hInst = 0;
@@ -161,6 +168,8 @@ private:
std::wstring app_key;
public:
+
+
// Return the localized display name of the powertoy
virtual PCWSTR get_name() override
{
@@ -178,6 +187,19 @@ public:
{
Logger::info(L"PowerRename enabled");
m_enabled = true;
+
+ if (package::IsWin11OrGreater())
+ {
+ std::wstring path = get_module_folderpath(g_hInst);
+ std::wstring packageUri = path + L"\\PowerRenameContextMenuPackage.msix";
+
+ std::wstring packageDisplayName{ L"PowerRenameContextMenu" };
+ if (!package::IsPackageRegistered(packageDisplayName))
+ {
+ package::RegisterSparsePackage(path, packageUri);
+ }
+ }
+
save_settings();
}
diff --git a/src/modules/powerrename/lib/Helpers.cpp b/src/modules/powerrename/lib/Helpers.cpp
index 45ab3e4715..f0476dd1dd 100644
--- a/src/modules/powerrename/lib/Helpers.cpp
+++ b/src/modules/powerrename/lib/Helpers.cpp
@@ -520,6 +520,31 @@ BOOL GetEnumeratedFileName(__out_ecount(cchMax) PWSTR pszUniqueName, UINT cchMax
return fRet;
}
+// Iterate through the shell items array and checks if at least 1 item has SFGAO_CANRENAME.
+// We do not enumerate child items - only the items the user selected.
+bool ShellItemArrayContainsRenamableItem(_In_ IShellItemArray* shellItemArray)
+{
+ bool hasRenamable = false;
+ IEnumShellItems* spesi;
+ if (SUCCEEDED(shellItemArray->EnumItems(&spesi)))
+ {
+ ULONG celtFetched;
+ IShellItem* spsi;
+ while ((S_OK == spesi->Next(1, &spsi, &celtFetched)))
+ {
+ SFGAOF attrs;
+ if (SUCCEEDED(spsi->GetAttributes(SFGAO_CANRENAME, &attrs)) &&
+ attrs & SFGAO_CANRENAME)
+ {
+ hasRenamable = true;
+ break;
+ }
+ }
+ }
+
+ return hasRenamable;
+}
+
// Iterate through the data source and checks if at least 1 item has SFGAO_CANRENAME.
// We do not enumerate child items - only the items the user selected.
bool DataObjectContainsRenamableItem(_In_ IUnknown* dataSource)
diff --git a/src/modules/powerrename/lib/Helpers.h b/src/modules/powerrename/lib/Helpers.h
index 68a5264e08..dbe21ceef3 100644
--- a/src/modules/powerrename/lib/Helpers.h
+++ b/src/modules/powerrename/lib/Helpers.h
@@ -8,6 +8,7 @@ HRESULT GetTrimmedFileName(_Out_ PWSTR result, UINT cchMax, _In_ PCWSTR source);
HRESULT GetTransformedFileName(_Out_ PWSTR result, UINT cchMax, _In_ PCWSTR source, DWORD flags, bool isFolder);
HRESULT GetDatedFileName(_Out_ PWSTR result, UINT cchMax, _In_ PCWSTR source, SYSTEMTIME fileTime);
bool isFileTimeUsed(_In_ PCWSTR source);
+bool ShellItemArrayContainsRenamableItem(_In_ IShellItemArray* shellItemArray);
bool DataObjectContainsRenamableItem(_In_ IUnknown* dataSource);
HRESULT GetShellItemArrayFromDataObject(_In_ IUnknown* dataSource, _COM_Outptr_ IShellItemArray** items);
BOOL GetEnumeratedFileName(
diff --git a/src/modules/previewpane/GcodePreviewHandler/GcodePreviewHandler.csproj b/src/modules/previewpane/GcodePreviewHandler/GcodePreviewHandler.csproj
index 1aecc28247..5beba910f4 100644
--- a/src/modules/previewpane/GcodePreviewHandler/GcodePreviewHandler.csproj
+++ b/src/modules/previewpane/GcodePreviewHandler/GcodePreviewHandler.csproj
@@ -16,7 +16,7 @@
{805306FF-A562-4415-8DEF-E493BDC45918}
Microsoft.PowerToys.PreviewHandler.Gcode
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
$(SolutionDir)$(Platform)\$(Configuration)\obj\$(AssemblyName)\
diff --git a/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj
index a13c760546..29692dd89d 100644
--- a/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj
+++ b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj
@@ -11,7 +11,7 @@
true
true
win10-x64;win10-arm64
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
diff --git a/src/modules/previewpane/MarkdownPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/modules/previewpane/MarkdownPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 9833d386ca..3cecd08b49 100644
--- a/src/modules/previewpane/MarkdownPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/modules/previewpane/MarkdownPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\modules\FileExplorerPreview
win10-$(Platform)
false
diff --git a/src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj b/src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj
index 6951ecc59c..61e1f37c4d 100644
--- a/src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj
+++ b/src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj
@@ -15,7 +15,7 @@
Microsoft.PowerToys.PreviewHandler.Monaco
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
$(SolutionDir)$(Platform)\$(Configuration)\obj\$(AssemblyName)\
PowerToys.MonacoPreviewHandler
diff --git a/src/modules/previewpane/MonacoPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/modules/previewpane/MonacoPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 9833d386ca..3cecd08b49 100644
--- a/src/modules/previewpane/MonacoPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/modules/previewpane/MonacoPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\modules\FileExplorerPreview
win10-$(Platform)
false
diff --git a/src/modules/previewpane/PdfPreviewHandler/PdfPreviewHandler.csproj b/src/modules/previewpane/PdfPreviewHandler/PdfPreviewHandler.csproj
index 21ab18e923..509df95214 100644
--- a/src/modules/previewpane/PdfPreviewHandler/PdfPreviewHandler.csproj
+++ b/src/modules/previewpane/PdfPreviewHandler/PdfPreviewHandler.csproj
@@ -15,7 +15,7 @@
{69E1EE8D-143A-4060-9129-4658ACF14AAF}
Microsoft.PowerToys.PreviewHandler.Pdf
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
$(SolutionDir)$(Platform)\$(Configuration)\obj\$(AssemblyName)\
PowerToys.PdfPreviewHandler
diff --git a/src/modules/previewpane/PdfThumbnailProvider/PdfThumbnailProvider.csproj b/src/modules/previewpane/PdfThumbnailProvider/PdfThumbnailProvider.csproj
index 16717a7f1c..0178795f14 100644
--- a/src/modules/previewpane/PdfThumbnailProvider/PdfThumbnailProvider.csproj
+++ b/src/modules/previewpane/PdfThumbnailProvider/PdfThumbnailProvider.csproj
@@ -6,7 +6,7 @@
PowerToys.PdfThumbnailProvider
PowerToys.PdfThumbnailProvider
PowerToys PdfPreviewHandler
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
true
PowerToys PdfPreviewHandler
diff --git a/src/modules/previewpane/SvgPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/modules/previewpane/SvgPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 9833d386ca..3cecd08b49 100644
--- a/src/modules/previewpane/SvgPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/modules/previewpane/SvgPreviewHandler/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\modules\FileExplorerPreview
win10-$(Platform)
false
diff --git a/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj
index 5d08472f65..be5c7a2237 100644
--- a/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj
+++ b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj
@@ -11,7 +11,7 @@
true
true
win10-x64;win10-arm64
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
diff --git a/src/modules/previewpane/SvgThumbnailProvider/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/modules/previewpane/SvgThumbnailProvider/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 9833d386ca..3cecd08b49 100644
--- a/src/modules/previewpane/SvgThumbnailProvider/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/modules/previewpane/SvgThumbnailProvider/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\modules\FileExplorerPreview
win10-$(Platform)
false
diff --git a/src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj b/src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj
index d06077c391..5d57ae7b8c 100644
--- a/src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj
+++ b/src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj
@@ -6,7 +6,7 @@
PowerToys.SvgThumbnailProvider
PowerToys.SvgThumbnailProvider
PowerToys SvgPreviewHandler
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
true
true
PowerToys SvgPreviewHandler
diff --git a/src/modules/previewpane/UnitTests-GcodePreviewHandler/UnitTests-GcodePreviewHandler.csproj b/src/modules/previewpane/UnitTests-GcodePreviewHandler/UnitTests-GcodePreviewHandler.csproj
index 1d0fbdd0af..5960dc1933 100644
--- a/src/modules/previewpane/UnitTests-GcodePreviewHandler/UnitTests-GcodePreviewHandler.csproj
+++ b/src/modules/previewpane/UnitTests-GcodePreviewHandler/UnitTests-GcodePreviewHandler.csproj
@@ -9,7 +9,7 @@
{FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}
PdfPreviewHandlerUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-GcodeThumbnailProvider/UnitTests-GcodeThumbnailProvider.csproj b/src/modules/previewpane/UnitTests-GcodeThumbnailProvider/UnitTests-GcodeThumbnailProvider.csproj
index 98eb421a3b..c85ad844d6 100644
--- a/src/modules/previewpane/UnitTests-GcodeThumbnailProvider/UnitTests-GcodeThumbnailProvider.csproj
+++ b/src/modules/previewpane/UnitTests-GcodeThumbnailProvider/UnitTests-GcodeThumbnailProvider.csproj
@@ -9,7 +9,7 @@
{133281D8-1BCE-4D07-B31E-796612A9609E}
GcodeThumbnailProviderUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-MarkdownPreviewHandler/UnitTests-MarkdownPreviewHandler.csproj b/src/modules/previewpane/UnitTests-MarkdownPreviewHandler/UnitTests-MarkdownPreviewHandler.csproj
index 7e699fb780..6f12104e43 100644
--- a/src/modules/previewpane/UnitTests-MarkdownPreviewHandler/UnitTests-MarkdownPreviewHandler.csproj
+++ b/src/modules/previewpane/UnitTests-MarkdownPreviewHandler/UnitTests-MarkdownPreviewHandler.csproj
@@ -10,7 +10,7 @@
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}
PreviewPaneUnitTests
PreviewPaneUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-PdfPreviewHandler/UnitTests-PdfPreviewHandler.csproj b/src/modules/previewpane/UnitTests-PdfPreviewHandler/UnitTests-PdfPreviewHandler.csproj
index 49890db593..ba69033755 100644
--- a/src/modules/previewpane/UnitTests-PdfPreviewHandler/UnitTests-PdfPreviewHandler.csproj
+++ b/src/modules/previewpane/UnitTests-PdfPreviewHandler/UnitTests-PdfPreviewHandler.csproj
@@ -9,7 +9,7 @@
{ECC20689-002A-4354-95A6-B58DF089C6FF}
PdfPreviewHandlerUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-PdfThumbnailProvider/UnitTests-PdfThumbnailProvider.csproj b/src/modules/previewpane/UnitTests-PdfThumbnailProvider/UnitTests-PdfThumbnailProvider.csproj
index c74d86d7b9..c012c533b2 100644
--- a/src/modules/previewpane/UnitTests-PdfThumbnailProvider/UnitTests-PdfThumbnailProvider.csproj
+++ b/src/modules/previewpane/UnitTests-PdfThumbnailProvider/UnitTests-PdfThumbnailProvider.csproj
@@ -9,7 +9,7 @@
{F40C3397-1834-4530-B2D9-8F8B8456BCDF}
PdfThumbnailProviderUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-StlThumbnailProvider/UnitTests-StlThumbnailProvider.csproj b/src/modules/previewpane/UnitTests-StlThumbnailProvider/UnitTests-StlThumbnailProvider.csproj
index 09d598e6cb..15c74e96e3 100644
--- a/src/modules/previewpane/UnitTests-StlThumbnailProvider/UnitTests-StlThumbnailProvider.csproj
+++ b/src/modules/previewpane/UnitTests-StlThumbnailProvider/UnitTests-StlThumbnailProvider.csproj
@@ -9,7 +9,7 @@
{F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}
StlThumbnailProviderUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj b/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj
index e1afd46bbc..e0edff0a48 100644
--- a/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj
+++ b/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj
@@ -9,7 +9,7 @@
{060D75DA-2D1C-48E6-A4A1-6F0718B64661}
SvgPreviewHandlerUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj b/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
index 1b3cb3c373..1390c1c0ba 100644
--- a/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
+++ b/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
@@ -9,7 +9,7 @@
{1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}
SvgThumbnailProviderUnitTests
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj b/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj
index 9bae4d7a74..4215193483 100644
--- a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj
+++ b/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj
@@ -6,7 +6,7 @@
{5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}
Win32Proj
overlaywindow
- 10.0.18362.0
+ 10.0.19041.0
VideoConferenceModule
diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj b/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj
index 2222dfe4dd..be60fac0f5 100644
--- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj
+++ b/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj
@@ -33,7 +33,7 @@
VideoConferenceProxyFilter
VideoConferenceProxyFilter
true
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj b/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj
index 8820e447c3..ade59c8e5f 100644
--- a/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj
+++ b/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj
@@ -38,7 +38,7 @@
{459e0768-7ebd-4c41-bba1-6db3b3815e0a}
VideoConferenceShared
true
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/src/runner/PowerToys.exe.manifest b/src/runner/PowerToys.exe.manifest
index 65f881cabc..fd0fa537c0 100644
--- a/src/runner/PowerToys.exe.manifest
+++ b/src/runner/PowerToys.exe.manifest
@@ -3,7 +3,7 @@
-
+
\ No newline at end of file
diff --git a/src/settings-ui/Settings.UI/PowerToys.Settings.csproj b/src/settings-ui/Settings.UI/PowerToys.Settings.csproj
index ad228e6ef3..1aac902138 100644
--- a/src/settings-ui/Settings.UI/PowerToys.Settings.csproj
+++ b/src/settings-ui/Settings.UI/PowerToys.Settings.csproj
@@ -2,7 +2,7 @@
WinExe
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
10.0.17763.0
Microsoft.PowerToys.Settings.UI
app.manifest
diff --git a/src/settings-ui/Settings.UI/Properties/PublishProfiles/InstallationPublishProfile.pubxml b/src/settings-ui/Settings.UI/Properties/PublishProfiles/InstallationPublishProfile.pubxml
index 2ae59c976c..a889615b38 100644
--- a/src/settings-ui/Settings.UI/Properties/PublishProfiles/InstallationPublishProfile.pubxml
+++ b/src/settings-ui/Settings.UI/Properties/PublishProfiles/InstallationPublishProfile.pubxml
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
FileSystem
- net6.0-windows10.0.18362.0
+ net6.0-windows10.0.19041.0
$(PowerToysRoot)\$(Platform)\$(Configuration)\Settings
win10-$(Platform)
false
diff --git a/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj b/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj
index a41eb84529..e31770bea8 100644
--- a/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj
+++ b/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj
@@ -48,6 +48,7 @@
+
@@ -68,6 +69,7 @@
+
diff --git a/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj.filters b/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj.filters
index d574367de9..5e981b3361 100644
--- a/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj.filters
+++ b/tools/BugReportTool/BugReportTool/BugReportTool.vcxproj.filters
@@ -15,6 +15,7 @@
+
@@ -33,5 +34,6 @@
+
\ No newline at end of file
diff --git a/tools/BugReportTool/BugReportTool/Main.cpp b/tools/BugReportTool/BugReportTool/Main.cpp
index 5bc9b5d603..f36da41be5 100644
--- a/tools/BugReportTool/BugReportTool/Main.cpp
+++ b/tools/BugReportTool/BugReportTool/Main.cpp
@@ -14,6 +14,7 @@
#include
#include
+#include "Package.h"
#include "ReportMonitorInfo.h"
#include "RegistryUtils.h"
#include "EventViewer.h"
@@ -351,6 +352,8 @@ int wmain(int argc, wchar_t* argv[], wchar_t*)
ReportInstallerLogs(tempDir, reportDir);
+ ReportInstalledContextMenuPackages(reportDir);
+
// Zip folder
auto zipPath = path::path(saveZipPath);
diff --git a/tools/BugReportTool/BugReportTool/Package.cpp b/tools/BugReportTool/BugReportTool/Package.cpp
new file mode 100644
index 0000000000..66d3ead465
--- /dev/null
+++ b/tools/BugReportTool/BugReportTool/Package.cpp
@@ -0,0 +1,78 @@
+#include "Package.h"
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+std::optional GetPackage(std::wstring packageDisplayName)
+{
+ using namespace winrt::Windows::Foundation;
+ using namespace winrt::Windows::Management::Deployment;
+
+ PackageManager packageManager;
+
+ for (auto const& package : packageManager.FindPackagesForUser({}))
+ {
+ const auto& packageFullName = std::wstring{ package.Id().FullName() };
+
+ if (packageFullName.contains(packageDisplayName))
+ {
+ return { package };
+ }
+ }
+
+ return std::nullopt;
+}
+
+std::wstringstream GetPackageInfo(winrt::Windows::ApplicationModel::Package package) {
+ std::wstringstream packageInfo;
+ packageInfo << L"Display name: " << std::wstring(package.DisplayName()) << std::endl;
+ packageInfo << L"Full name: " << std::wstring(package.Id().FullName()) << std::endl;
+ packageInfo << L"Version: " << package.Id().Version().Major << L"."
+ << package.Id().Version().Minor << L"."
+ << package.Id().Version().Build << L"."
+ << package.Id().Version().Revision << L"." << std::endl;
+ packageInfo << L"Publisher: " << std::wstring(package.Id().Publisher()) << std::endl;
+ packageInfo << L"Status: " << (package.Status().VerifyIsOK() ? std::wstring(L"OK") : std::wstring(L"Not OK")) << std::endl;
+
+ return packageInfo;
+}
+
+void ReportInstalledContextMenuPackages(const std::filesystem::path& reportDir)
+{
+ const wchar_t* ImageResizerContextMenuPackageDisplayName = L"ImageResizerContextMenu";
+ const wchar_t* PowerRenameContextMenuPackageDisplayName = L"PowerRenameContextMenu";
+
+ auto reportPath = reportDir;
+ reportPath.append("context-menu-packages.txt");
+
+ std::wofstream packagesReport(reportPath);
+
+ try
+ {
+ auto imageResizerPackage = GetPackage(ImageResizerContextMenuPackageDisplayName);
+ if (imageResizerPackage)
+ {
+ packagesReport << GetPackageInfo(*imageResizerPackage).str() << std::endl;
+ }
+
+ auto powerRenamePackage = GetPackage(PowerRenameContextMenuPackageDisplayName);
+ if (powerRenamePackage)
+ {
+ packagesReport << GetPackageInfo(*powerRenamePackage).str() << std::endl;
+ }
+ }
+ catch (...)
+ {
+ printf("Failed to report installed context menu packages");
+ }
+}
diff --git a/tools/BugReportTool/BugReportTool/Package.h b/tools/BugReportTool/BugReportTool/Package.h
new file mode 100644
index 0000000000..a7527793d6
--- /dev/null
+++ b/tools/BugReportTool/BugReportTool/Package.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+std::optional GetPackage(std::wstring packageDisplayName);
+std::wstringstream GetPackageInfo(winrt::Windows::ApplicationModel::Package package);
+void ReportInstalledContextMenuPackages(const std::filesystem::path& reportDir);
diff --git a/tools/MonitorReportTool/MonitorReportTool.vcxproj b/tools/MonitorReportTool/MonitorReportTool.vcxproj
index ec20ed5c06..bcd7b8874e 100644
--- a/tools/MonitorReportTool/MonitorReportTool.vcxproj
+++ b/tools/MonitorReportTool/MonitorReportTool.vcxproj
@@ -5,7 +5,7 @@
Win32Proj
{0febafaf-cb77-41f0-8ef9-8e3ad4b4f842}
MonitorReportTool
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/tools/StylesReportTool/StylesReportTool.vcxproj b/tools/StylesReportTool/StylesReportTool.vcxproj
index 5acb15465d..6e3ee0449d 100644
--- a/tools/StylesReportTool/StylesReportTool.vcxproj
+++ b/tools/StylesReportTool/StylesReportTool.vcxproj
@@ -5,7 +5,7 @@
Win32Proj
{0febafaf-cb77-41f0-8ef9-8e3ad4b4f842}
StylesReportTool
- 10.0.18362.0
+ 10.0.19041.0
diff --git a/tools/build/convert-resx-to-rc.ps1 b/tools/build/convert-resx-to-rc.ps1
index 3884c4eafa..1356aeb20c 100644
--- a/tools/build/convert-resx-to-rc.ps1
+++ b/tools/build/convert-resx-to-rc.ps1
@@ -141,15 +141,17 @@ Foreach-Object {
exit 0
}
- # Add string table syntax
- $newLinesForRCFile = "`r`nSTRINGTABLE`r`nBEGIN" + $newLinesForRCFile + "`r`nEND"
+ if ($newLinesForRCFile -ne "") {
+ # Add string table syntax
+ $newLinesForRCFile = "`r`nSTRINGTABLE`r`nBEGIN" + $newLinesForRCFile + "`r`nEND"
- $langStart = "`r`n/////////////////////////////////////////////////////////////////////////////`r`n// " + $langData[3] + " resources`r`n`r`n"
- $langStart += "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_" + $langData[0] + ")`r`nLANGUAGE LANG_" + $langData[1] + ", SUBLANG_" + $langData[2] + "`r`n"
+ $langStart = "`r`n/////////////////////////////////////////////////////////////////////////////`r`n// " + $langData[3] + " resources`r`n`r`n"
+ $langStart += "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_" + $langData[0] + ")`r`nLANGUAGE LANG_" + $langData[1] + ", SUBLANG_" + $langData[2] + "`r`n"
- $langEnd = "`r`n`r`n#endif // " + $langData[3] + " resources`r`n/////////////////////////////////////////////////////////////////////////////`r`n"
+ $langEnd = "`r`n`r`n#endif // " + $langData[3] + " resources`r`n/////////////////////////////////////////////////////////////////////////////`r`n"
- $newLinesForRCFile = $langStart + $newLinesForRCFile + $langEnd
+ $newLinesForRCFile = $langStart + $newLinesForRCFile + $langEnd
+ }
# Initialize the rc file with an auto-generation warning and content from the base rc
if (!$rcFileUpdated) {
diff --git a/tools/project_template/ModuleTemplate/ModuleTemplateCompileTest.vcxproj b/tools/project_template/ModuleTemplate/ModuleTemplateCompileTest.vcxproj
index a43fc91e9e..4761c8466e 100644
--- a/tools/project_template/ModuleTemplate/ModuleTemplateCompileTest.vcxproj
+++ b/tools/project_template/ModuleTemplate/ModuleTemplateCompileTest.vcxproj
@@ -6,7 +6,7 @@
{64A80062-4D8B-4229-8A38-DFA1D7497749}
Win32Proj
templatenamespace
- 10.0.18362.0
+ 10.0.19041.0
ModuleTemplateCompileTest