diff --git a/src/settings-ui/Settings.UI/App.xaml.cs b/src/settings-ui/Settings.UI/App.xaml.cs index 2c83d1dc3a..26a4702a20 100644 --- a/src/settings-ui/Settings.UI/App.xaml.cs +++ b/src/settings-ui/Settings.UI/App.xaml.cs @@ -149,9 +149,11 @@ namespace Microsoft.PowerToys.Settings.UI } else { - // Create the Settings window so that it's fully initialized and + // Create the Settings window hidden so that it's fully initialized and // it will be ready to receive the notification if the user opens // the Settings from the tray icon. + settingsWindow = new MainWindow(true); + if (ShowOobe) { PowerToysTelemetry.Log.WriteEvent(new OobeStartedEvent()); diff --git a/src/settings-ui/Settings.UI/Helpers/NativeMethods.cs b/src/settings-ui/Settings.UI/Helpers/NativeMethods.cs index 376a1d097b..d247c03f1c 100644 --- a/src/settings-ui/Settings.UI/Helpers/NativeMethods.cs +++ b/src/settings-ui/Settings.UI/Helpers/NativeMethods.cs @@ -15,6 +15,7 @@ namespace Microsoft.PowerToys.Settings.UI.Helpers internal const int SPI_GETDESKWALLPAPER = 0x0073; internal const int SW_SHOWNORMAL = 1; internal const int SW_SHOWMAXIMIZED = 3; + internal const int SW_HIDE = 0; [DllImport("user32.dll")] internal static extern IntPtr GetActiveWindow(); @@ -44,6 +45,9 @@ namespace Microsoft.PowerToys.Settings.UI.Helpers [DllImport("user32.dll")] public static extern int GetDpiForWindow(System.IntPtr hWnd); + [DllImport("user32.dll")] + public static extern bool IsWindowVisible(IntPtr hWnd); + [DllImport("user32.dll")] public static extern bool AllowSetForegroundWindow(int dwProcessId); diff --git a/src/settings-ui/Settings.UI/MainWindow.xaml.cs b/src/settings-ui/Settings.UI/MainWindow.xaml.cs index 86c4cf4859..b7e111c022 100644 --- a/src/settings-ui/Settings.UI/MainWindow.xaml.cs +++ b/src/settings-ui/Settings.UI/MainWindow.xaml.cs @@ -22,7 +22,7 @@ namespace Microsoft.PowerToys.Settings.UI /// public sealed partial class MainWindow : Window { - public MainWindow() + public MainWindow(bool createHidden = false) { var bootTime = new System.Diagnostics.Stopwatch(); bootTime.Start(); @@ -37,6 +37,11 @@ namespace Microsoft.PowerToys.Settings.UI appWindow.SetIcon("icon.ico"); var placement = Utils.DeserializePlacementOrDefault(hWnd); + if (createHidden) + { + placement.ShowCmd = NativeMethods.SW_HIDE; + } + NativeMethods.SetWindowPlacement(hWnd, ref placement); ResourceLoader loader = ResourceLoader.GetForViewIndependentUse(); @@ -105,12 +110,29 @@ namespace Microsoft.PowerToys.Settings.UI ShellPage.Navigate(type); } + public void CloseHiddenWindow() + { + var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this); + if (!NativeMethods.IsWindowVisible(hWnd)) + { + Close(); + } + } + private void Window_Closed(object sender, WindowEventArgs args) { - App.ClearSettingsWindow(); - var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this); Utils.SerializePlacement(hWnd); + + if (App.GetOobeWindow() == null) + { + App.ClearSettingsWindow(); + } + else + { + args.Handled = true; + NativeMethods.ShowWindow(hWnd, NativeMethods.SW_HIDE); + } } } } diff --git a/src/settings-ui/Settings.UI/OobeWindow.xaml.cs b/src/settings-ui/Settings.UI/OobeWindow.xaml.cs index cce140fcd0..1c9a075ba8 100644 --- a/src/settings-ui/Settings.UI/OobeWindow.xaml.cs +++ b/src/settings-ui/Settings.UI/OobeWindow.xaml.cs @@ -104,6 +104,12 @@ namespace Microsoft.PowerToys.Settings.UI private void Window_Closed(object sender, WindowEventArgs args) { App.ClearOobeWindow(); + + var mainWindow = App.GetSettingsWindow(); + if (mainWindow != null) + { + mainWindow.CloseHiddenWindow(); + } } } }