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